Win32asm обучение


Урок 13 - Окна в windows - часть 7


WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL hwnd:DWORD
LOCAL msg:MSG ;<<<новая переменная

........

.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW

Вот, как может выглядеть цикл сообщений. .WHILE TRUE, .ENDW повторяют цикл до тех пор, пока eax не стпнет равным 0. Функция GetMessage возвращает 0, если получает сообщение WM_QUIT, которое должно закрыть окно, так что программа должна выйти из цикла сообщений всякий раз, когда GetMessage возвращает 0. Если нет, то сообщение передается функции TranslateMessage (эта функция транслирует нажатия клавиш в сообщения) и затем сообщение посылается окной процедуре, с помощью функции DispatchMessage. Сообщение непосредственно в цикле сообщений состоит из структуры MSG (для этого мы в процедуру добавили LOCAL msg:MSG). Вы можете использовать этот цикл сообщений во всех своих программах.

12.7 - Оконная процедура

Сообщения будут посланы оконной процедуре. Оконная процедура должна всегда выглядеть следующим образом:

WndProc PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD

.code

WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
mov eax, uMsg
.IF eax==XXXX
.ELSEIF eax==XXXX
.ELSE
    invoke DefWindowProc, hWnd, uMsg, wParam, lParam
.ENDIF
ret
WndProc endp

Оконная процедура должна всегда иметь 4 параметра:

hWnd содержит хэндл окна.
uMsg это сообщение
wParam это первый параметр для сообщения
lParam второй параметр для сообщения

Сообщения, которые не обрабатывает окно, должны быть переданы функции DefWindowProc, которая занимается их обработкой. Пример оконной прцедуры:

WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
mov eax, uMsg
.IF eax==WM_CREATE
    invoke MessageBox, NULL, ADDR AppName, ADDR AppName, NULL
.ELSEIF eax==WM_DESTROY
    invoke PostQuitMessage, NULL
.ELSE
    invoke DefWindowProc, hWnd, uMsg, wParam, lParam
.ENDIF
ret
WndProc endp

Этот код отображает название приложения, при содании окна. Также, обратите внимание, что я добавил обработку сообщения WM_DESTROY. Это сообщение будет послано, если окно закрывается (т.е. вы нажали закрыть). Приложение должно реагировать на это сообщение функцией PostQuitMessage.

А теперь посмотрите, что у нас получилось:

<смотреть код>

[наверх]




- Начало -  - Назад -  - Вперед -



Книжный магазин