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

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


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


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

MessageBox, за чем он нужен?


Доброго время суток, уважаемые подписчики. Итак, мы уже написали штаблон окна. В этом уроке мы его немного дополним, а также обсудим все процедуры Windows, которые мы использовали!


Вот список всех процедур, которые мы использовали. Первый столбец содержит название процедуры, второй - параметры, третий - описание!
Процедуры из kernel32.dll:
GetModuleHandle модуль Возвращает указатель на заданый модуль
ExitProcess код выхода Завершает приложение
Процедуры из user32.dll:
DispatchMessage адрес структуры сообщений Распаковывает сообщения для процедуры окна
TranslateMessage адрес структуры сообщений Переводит сообщение о нажатии клавиши в сообщение клавиши
GetMessage Первое сообщение
Последнее сообщ.
Указатель на окно
Адрес струк. сообщ.
Получает сообщения заданного объекта в заданную структуру сообщения
LoadIcon Указатель иконки
Указатель на процедуру
Устанавливает заданному приложению заданную иконку
UpdateWindow указатель на процедуру Позылает заданной процедуре сообщение wm_paint
ShowWindow Параметры
указатель на проц.
Устанавливает вид окна
DefWindowProc Первое сообщение
Последнее сообщ.
Указатель на окно
Адрес струк. сообщ.
Передаёт управление процедуре окна по умолчанию
PostQuitMessage Код выхода Посылает сообщения выхода всем частям приложения
RegisterClassEx Адрес структуры параметров окна Регистрирует структуру для последующего создания окна
LoadCursor Указатель курсора
Указатель на процедуру
Устанавливает заданному приложению заданный курсор
DestroyWindow указатель на окно Уничтожает окно

Вы, наверно, уже заметили, что в таблице нет процедуры CreateWindowEX. Я специально не поместил её в таблицу, так как она получает 12 параметров, и Вы бы только больше запутались увидев её в таблице. Её мы рассмотрим отдельно. Процедура создаёт "окно" заданного класса в заданное место.При этом она получает следующие параметры:
- указатель на данные создания окна
- указатель на приложение, вызывающие окно
- указатель на меню
- указатель на окно-отца
- высота окна
- длинна окна
- вертикальное положение окна
- горизонтальное положение окна
- стиль окна
- имя окна
- класс окна
- дополнительные параметры стиля окна
Возвращаемый в eax параметр является указателем на окно.


А теперь займёмся повторением MessageBox и улучшением нашего окна! Итак, что такое MessageBox. Многие считают, что это просто вывод сообщения, однако это всего лишь заблуждение. Messagebox бывают разные, и то, как они выглядят зависит от заданного типа. Вот основные типы:
тип кол-во кнопок кнопки
MB_ABORTRETRYIGNORE 3 abort,retry,ignore
MB_OK 1 OK
MB_OKCANCEL 2 OK,Cancel
MB_RETRYCANCEL 2 retry,cancel
MB_YESNO 2 yes,no
MB_YESNOCANCEL 3 yes,no,Cancel
При этом в русском Windows все названия кнопок будут русскими, в немецком, соответсвенно, немецкими. Это делает MessageBox очень полезной вещью. При этом стоит заметить, что тот же самый эффект можно достигнуть написав диалог, использующий две кнопки, однако это заняло бы гораздо больше места.

Приступим непосредственно к коду. Писать программу с нуля я считаю не нужным, поэтому я лишь добавлю пару строчек в программу окна, рассматриваемую до этого. Добавленные части я выделил красным!

includedef32.inc
includeuser32.inc
include kernel32.inc
.386
.modelflat
.const
classdb"window class 1",0
name_db"Da window!",0
suredb"Предупреждение",0
askdb"Вы уверены, что хотите выйти?",0
.data
wcwndclassex<4*12,cs_hredraw or cs_vredraw,offset win_proc,0,0,?,?,?, color_window+1,0,offset class,0>
.data?
msg_msg<?,?,?,?,?,?>
.code
_start:
xorebx,ebx
pushebx
callGetmodulehandle
movesi,eax
movdword ptr wc.hInstance,eax
pushIDI_Application
pushebx
callloadicon
movwc.hIcon,eax
pushidc_arrow
pushebx
callLoadCursor
movwc.hCursor,eax
pushoffset wc
callregisterclassEx
movecx,CW_usedefault
pushebx
pushesi
pushebx
pushebx
pushecx
pushecx
pushecx
pushecx
pushws_overlappedwindow
pushoffset name_
pushoffset class
pushebx
callcreatewindowex
pusheax
pushsw_shownormal
pusheax
callshowwindow
callupdatewindow
movedi,offset msg_
main_:
pushebx
pushebx
pushebx
pushedi
callGetmessage
testeax,eax
jzexit_
pushedi
calltranslatemessage
pushedi
calldispatchmessage
jmpmain_
exit_:
pushebx
callexitprocess
win_procproc
pushebp
movebp,esp
wp_hWndequdword ptr [ebp+08h]
wp_uMsgequdword ptr [ebp+0Ch]
wp_wParamequdword ptr [ebp+10h]
wp_lParamequdword ptr [ebp+14h]
cmpwp_uMsg,wm_close
jnenot_close
pushMB_YesNo
pushoffset sure
pushoffset ask
push0
callMessageBox
cmpeax,IDYES
jenot_close
movwp_uMsg,0
jmpnot_
not_close:
cmpwp_uMsg,wm_destroy
jnenot_
push0
callpostquitmessage
jmpend_
not_:
leave
jmpDefWindowProc
end_:
leave
ret16
win_procendp
end_start
При этом в файл user32.inc следует дописать следующие строки:

extrn __imp__MessageBoxA@16:dword
MessageBox equ __imp__MessageBoxA@16

А в файл def32.inc

MB_YESNO equ 4
IDYES equ 6
WM_CLOSE equ 10h

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


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


be number one Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru

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

В избранное