Ассемблер под Windows №8

Значение диалогов в Windows


Доброго времени суток, уважаемые подписчики. В прошлом уроке мы написали программу, использующую диалог, как основной объект, сегодня я постараюсь доходчиво объяснить, как это всё работает! Так как файлы ресурсов очень трудно (я бы сказал почти невозможно) делать вручную, то описания ресурсов мы пропустим и сразу приступим к программе dialog.asm:
IDC_EDIT    equ 0
IDC_BUTTON  equ 1
IDC_EXIT    equ 2
IDM_GETTEXT equ 10
IDM_CLEAR   equ 11
IDM_EXIT    equ 12
Эти 6 строк облегчают нам задачу, так как нам не надо помнить номер объекта, только его имя.
include def32.inc
include user32.inc
include kernel32.inc
Добавляем нужные нам библиотеки.
    .386
    .model flat
Стандартное начало Windows приложения.
    .data
dialog_name db 'IDM_Dialog',0
    .data?
text_       db 512 dup(?)
Данные программы, имя диалога из ресурсов и место для хранения строки.

    .code
_start:
 xor ebx,ebx
 push ebx
 call GetModuleHandle
 push ebx
 push offset dialog_proc
 push ebx
 push offset dialog_name
 push eax
 call DialogBoxParam
 push ebx
 call ExitProcess

Вот собственно и вся программа! Получаем handle нашей программы и вызываем диалог с именем в dialog_name и с процедурой обработки dialog_proc. Посе этого завершаем программу.
dialog_proc proc
 push ebp
 mov ebp,esp

dp_hWnd   equ dword ptr [ebp+08h]
dp_uMsg   equ dword ptr [ebp+0Ch]
dp_wParam equ dword ptr [ebp+10h]
dp_lParam equ dword ptr [ebp+14h]

 mov ecx,dp_hWnd
 mov eax,dp_uMsg
 cmp eax,WM_INITDIALOG
 jne not_init
 push IDC_EDIT
 push dp_hWnd
 call GetDlgItem
 push eax
 call SetFocus
not_init:
 cmp eax,WM_CLOSE
 jne not_close
 push 0
 push ecx
 call EndDialog
not_close:
 cmp eax,WM_COMMAND
 jne not_command
 mov eax,dp_wParam
 cmp dp_lParam,0
 jne iParam_yes
 cmp eax,IDM_GETTEXT
 jne not_gettext
 push 512
 push offset text_
 push IDC_EDIT
 push ecx
 call GetDlgItemText
 push MB_OK
 push offset dialog_name
 push offset text_
 push dp_hWnd
 call MessageBox
not_gettext:
 cmp eax,IDM_CLEAR
 jne not_clear
 push 0
 push IDC_EDIT
 push ecx
 call SetDlgItemText
not_clear:
 cmp eax,IDM_EXIT
 jne not_exit
 push 0
 push ecx
 call EndDialog
lParam_yes:
 cmp eax,IDC_EXIT
 jne not_exit
 shr eax,16
 cmp eax,BN_CLICKED
 push 0
 push ecx
 call EndDialog
not_exit:
 xor eax,eax
 inc eax
 leave
 ret 16
not_command:
 xor eax,eax
 leave
 ret 16
dialog_proc endp
 end _start
А это, соответственно, процедура диалога. Не смотря на то, что она кажется очень сложной ничего сложного в ней нет и, к тому же, она очень похожа на процедуру окна. Рассмотрим, что же она делает. Итак, она получает 4 параметра, в начале она проверяет сообщение окна на наличие основных комманд, если находит команду wm_command, которая означает, что меню диалога посылает сообщение, то процедура проверяет верхний параметр сообщения. Также она смотрит, не нажата ли какая кнопка в диалоге, такие сообщения помещаются в нижний параметр сообщения. Вот в принципя всё, я думаю особо объяснять это не надо.


На сегодня это всё. Если есть какие вопросы, пишите, обязательно отвечу. В следующий раз Вы узнаете как в Windows происходит работа с файлами. Пишите, Dark_Lord@RusFAQ.ru, Dark_Lord@land.ru.

Сайт управляется системой uCoz