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

Значение диалогов в 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.

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