Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


Информационный Канал Subscribe.Ru


Ассемблер под 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_procproc
pushebp
movebp,esp
dp_hWndequdword ptr [ebp+08h]
dp_uMsgequdword ptr [ebp+0Ch]
dp_wParamequdword ptr [ebp+10h]
dp_lParamequdword ptr [ebp+14h]
movecx,dp_hWnd
moveax,dp_uMsg
cmpeax,wm_initdialog
jnenot_init
pushIDC_EDIT
pushdp_hWnd
callGetDlgItem
pusheax
callSetFocus
not_init:
cmpeax,wm_close
jnenot_close
push0
pushecx
callEndDialog
not_close:
cmpeax,wm_command
jnenot_command
moveax,dp_wParam
cmpdp_lParam,0
jneiParam_yes
cmpeax,IDM_GETTEXT
jnenot_gettext
push512
pushoffset text_
pushIDC_EDIT
pushecx
callGetDlgItemText
pushMB_OK
pushoffset dialog_name
pushoffset text_
pushdp_hWnd
callMessageBox
not_gettext:
cmpeax,IDM_CLEAR
jnenot_clear
push0
pushIDC_EDIT
pushecx
callSetDlgItemText
not_clear:
cmpeax,IDM_EXIT
jnenot_exit
push0
pushecx
callEndDialog
lParam_yes:
cmpeax,IDC_EXIT
jnenot_exit
shreax,16
cmpeax,BN_CLICKED
push0
pushecx
callEndDialog
not_exit:
xoreax,eax
inceax
leave
ret16
not_command:
xoreax,eax
leave
ret16
dialog_procendp
end_start
А это, соответственно, процедура диалога. Не смотря на то, что она кажется очень сложной ничего сложного в ней нет и, к тому же, она очень похожа на процедуру окна. Рассмотрим, что же она делает. Итак, она получает 4 параметра, в начале она проверяет сообщение окна на наличие основных комманд, если находит команду wm_command, которая означает, что меню диалога посылает сообщение, то процедура проверяет верхний параметр сообщения. Также она смотрит, не нажата ли какая кнопка в диалоге, такие сообщения помещаются в нижний параметр сообщения. Вот в принципя всё, я думаю особо объяснять это не надо.


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



При поддержке RusFAQ.ru

be number one


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное