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

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


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


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

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


Доброго времени суток, уважаемые подписчики. В прошлом уроке мы сказали, что ресурсы, это такие объекты, которые не надо создавать самому, лишь описать их. Также мы причислили меню к ресурсам. Сегодня мы познакомимся с так называемыми диалогами, наиболее удобным средством сбора информации в Windows. Так как очень часто бывает, что смысла создавать окно нет, а некоторую информацию вывести надо, диалоги могут быть очень хорошо используемы. К сожалению, описание диалогов вещь достаточно трудная, и Вам придётся использовать какую-нибудь программу редактор ресурсов, я лично использую Borland Workshop.


Начнём с описания диалогов и меню. Оба объекта ресурсы, поэтому они могут находиться в одном файле диалогов! После того как Вы перепишите следующее в файл menu.rc, а именно туда это надо записать, вы можете зайти в редактор ресурсов и посмотреть оттуда, что-же мы записали! Итак, новое содержимое menu.rc

#define DS_CENTER0x0800L
#define DS_MODALFRAME0x80L
#define DS_3DLOOK0x0004L
#define WS_MINIMIZEBOX0x00020000L
#define WS_SYSMENU0x00080000L
#define WS_VISIBLE0x10000000L
#define WS_OVERLAPPED0x00000000L
#define WS_CAPTION0xC00000L
#define ES_AUTOHSCROLL0x80L
#define ES_LEFT0
#define ZDLG_MENU7
#define IDC_EDIT0
#define IDC_BUTTON1
#define IDC_EXIT2
#define IDM_GETTEXT10
#define IDM_CLEAR11
#define IDM_EXIT12
IDM_Dialog DIALOG10,10,205,30
STYLE DS_CENTER |DS_MODALFRAME | DS_3DLOOK |WS_CAPTION | WS_MINIMIZEBOX |
WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED
CAPTION"Пример диалога на ассемблере"
MENUZDLG_MENU
BEGIN
EDITTEXTIDC_EDIT,15,7,111,13,ES_AUTOHSCROLL | ES_LEFT
PUSHBUTTON"E&xit",IDC_EXIT,141,8,52,13
END
ZDLG_MENUMENU
BEGIN
POPUP "Test"
BEGIN
MENUITEM"Get Text",IDM_GETTEXT
MENUITEM"Clear Text",IDM_CLEAR
MENUITEMSEPARATOR
MENUITEM"E&xit",IDM_EXIT
END
END

Рассматривать всё это я не считаю нужным, так как я очень не советую писать такие вещи в ручную, а редактор ресурсов сам всё запишет!

Как вы, наверно, уже поняли мы не будем дополнять программу из прошлых выпусков, а создадим новую, dialog.asm со следующим содержанием:

IDC_EDITequ0
IDC_BUTTONequ1
IDC_EXITequ2
IDM_GETTEXTequ10
IDM_CLEARequ11
IDM_EXITequ12
includedef32.inc
includeuser32.inc
include kernel32.inc
.386
.modelflat
.data
dialog_namedb'IDM_Dialog',0
.data?
text_db512 dup(?)
.code
_start:
xorebx,ebx
pushebx
callGetmodulehandle
pushebx
push offset dialog_proc
pushebx
pushoffset dialog_name
pusheax
callDialogBoxParam
pushebx
callexitprocess
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

Обсуждение думаю отложить до следующего урока (макс. через неделю!)

И в этот раз без добавлений процедур не обойтись в файл user32.inc следует дописать следующие строки:

extrn __imp__DialogBoxParamA@20:dword
extrn __imp__GetDlgItem@8:dword
extrn __imp__SetFocus@4:dword
extrn __imp__GetDlgItemTextA@16:dword
extrn __imp__SetDlgItemTextA@12:dword
extrn __imp__EndDialog@8:dword
DialogBoxParam equ __imp__DialogBoxParamA@20
GetDlgItem equ __imp__GetDlgItem@8
SetFocus equ __imp__SetFocus@4
GetDlgItemText equ __imp__GetDlgItemTextA@16
SetDlgItemText equ __imp__SetDlgItemTextA@12
EndDialog equ __imp__EndDialog@8

А в файл def32.inc

WM_initdialog equ 110h
bn_Clicked equ 0

Причём, если Вы получили файлы inc от меня, то проверьте, возможно это уже записано в них! Тогда нет надобности записовать всё дважды. Если что не работает, пишите.
Все файлы ткущего урока можно скачать здесь, формат WinRaR.
doit.bat должен содержать следующее:

ml /c /coff dialog.asm
rc /r menu.rc
link32 dialog.obj menu.res /subsystem:windows


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



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

be number one


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

В избранное