Значение диалогов в Windows
Доброго времени суток, уважаемые подписчики. В прошлом уроке мы сказали, что ресурсы, это такие объекты, которые не надо создавать самому, лишь описать их. Также мы причислили меню к ресурсам. Сегодня мы познакомимся с так называемыми диалогами, наиболее удобным средством сбора информации в Windows. Так как очень часто бывает, что смысла создавать окно нет, а некоторую информацию вывести надо, диалоги могут быть очень хорошо используемы. К сожалению, описание диалогов вещь достаточно трудная, и Вам придётся использовать какую-нибудь программу редактор ресурсов, я лично использую Borland Workshop.
Начнём с описания диалогов и меню. Оба объекта ресурсы, поэтому они могут находиться в одном файле ресурсов! После того как Вы перепишите следующее в файл menu.rc, а именно туда это надо записать, вы можете зайти в редактор ресурсов и посмотреть оттуда, что-же мы записали! Итак, новое содержимое menu.rc:
#define DS_CENTER 0x0800L
#define DS_MODALFRAME 0x80L
#define DS_3DLOOK 0x0004L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_SYSMENU 0x00080000L
#define WS_VISIBLE 0x10000000L
#define WS_OVERLAPPED 0x00000000L
#define WS_CAPTION 0xC00000L
#define ES_AUTOHSCROLL 0x80L
#define ES_LEFT 0
#define ZDLG_MENU 7
#define IDC_EDIT 0
#define IDC_BUTTON 1
#define IDC_EXIT 2
#define IDM_GETTEXT 10
#define IDM_CLEAR 11
#define IDM_EXIT 12
IDM_Dialog DIALOG 10, 10, 205, 30
STYLE DS_CENTER|DS_MODALFRAME|DS_3DLOOK|WS_CAPTION|WS_MINIMIZEBOX|WS_SYSMENU|WS_VISIBLE
CAPTION "Пример диалога на ассемблере"
MENU ZDLG_MENU
{
EDITTEXT IDC_EDIT, 15, 7, 111, 13, ES_AUTOHSCROLL | ES_LEFT
PUSHBUTTON "E&xit",IDC_EXIT,141,8,52,13
}
ZDLG_MENU MENU
{
POPUP "Test"
{
MENUITEM "Get Text",IDM_GETTEXT
MENUITEM "Clear Text",IDM_CLEAR
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
}
}
|
Рассматривать всё это я не считаю нужным, так как я очень не советую писать такие вещи вручную, а редактор ресурсов сам всё запишет!
Как вы, наверно, уже поняли, мы не будем дополнять программу из прошлых выпусков, а создадим новую, 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
include def32.inc
include user32.inc
include kernel32.inc
.386
.model flat
.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
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
|
Обсуждение думаю отложить до следующего урока.
И в этот раз без добавлений процедур не обойтись в файл 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 000h
|
Причём, если Вы получили файлы 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.
|