Значение диалогов в 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
|
Добавляем нужные нам библиотеки.
Стандартное начало 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.