Assembler - язык неограниченных возможностей


Меню - часть 3


menu_handlers dd offset menu_test,offset menu_open dd offset menu_save,offset menu_exit

; обработчики событий test, open и save выводят MessageBox ; обработчик exit выходит из программы

menu_test: mov eax,offset test_msg ; сообщение для MessageBox jmp short show_msg menu_open: mov eax,offset open_msg ; сообщене для MessageBox jmp short show_msg menu_save: mov eax,offset save_msg ; сообщение для MessageBox show_msg: push MB_OK ; стиль для MessageBox push offset menu_name ; заголовок push eax ; сообщение push wp_hWnd ; идентификатор окна-предка call MessageBox ; вызов функции jmp short end_wm_check ; выход из win_proc menu_exit: ; если выбрали пункт EXIT push wp_hWnd call DestroyWindow ; уничтожим наше окно end_wm_check: leave ;* xor eax,eax ; вернем 0 как результат работы процедуры ret 16 ;* not_wm_command: ; not_wm_command, чтобы избавиться от лишнего jmp leave ;* jmp DefWindowProc ;* win_proc endp ;* end _start ;*

Итого: из 120 строк программы новыми оказались всего 36, в то время как программа, с точки зрения пользователя, стала намного сложнее. Так и выглядит все программирование под Windows на ассемблере — берется одна написанная раз и навсегда шаблонная программа, модифицируются ресурсы и пишутся обработчики для различных событий меню и диалогов. Фактически все программирование оказывается сосредоточенным именно в этих процедурах-обработчиках.

Добавления к включаемым файлам в этом примере тоже оказываются незначительными по сравнению с window.asm.

В user32.inc между ifdef _TASM_ и else:

extrn LoadMenuA:near extrn DestroyWindow:near LoadMenu equ LoadMenuA

и между else и endif:

extrn __imp__LoadMenuA@8:dword extrn __imp__DestroyWindow@4:dword LoadMenu equ __imp__LoadMenuA@8 DestroyWindow equ __imp__DestroyWindow@4

и в def32.inc:

; из winuser.h WM_COMMAND equ 111h MB_OK equ 0





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