Êóðñîâàÿ ðàáîòà: Ñîçäàòü ìåíþ áåç ôàéëà îïèñàíèÿ ðåñóðñîâ ñ ïîìîùüþ ôóíêöèé CreateMenu è CreatePopupMenu
extrn ShowWindow :PROC
extrn TranslateMessage :PROC
extrn UpdateWindow :PROC
extrn CreateMenu :PROC
extrn MessageBoxA :PROC
extrn AppendMenuA :PROC
extrn DrawMenuBar :PROC
extrn CreatePopupMenu :PROC
.data ; ïåðåîïðåäåëåííîå èìÿ, îçíà÷àþùåå íà÷àëî ñåãìåíòà
; äàííûõ
newhwnd dd 0
lppaint PAINTSTRUCT <?>
msg MSGSTRUCT <?>
wc WNDCLASS <?>
hInst dd 0
fl dw 0
szTitleName db 'Ýòî íàøå îêíî',0
szClassName db 'ASMCLASS32',0
szHello db 'Ïðèâåò!',0
szAppName db 'Ñîîáùåíèå',0
hMenu dd 0
hsubmenu dd 0
item1 db 'Ìåíþ',0
item2 db 'Âûõîä',0
item3 db 'Âîçâðàò',0
.code ; ïåðåîïðåäåëåííîå èìÿ, îçíà÷àþùåå íà÷àëî
; ñåãìåíòà êîäà
start:
push L 0
call GetModuleHandleA
mov [hInst], eax
;èíèöèàëèçàöèÿ ñòðóêòóðû WndClass
mov [wc.clsStyle], CS_HREDRAW + CS_VREDRAW +
CS_GLOBALCLASS
mov [wc.clsLpfnWndProc], offset WndProc
mov [wc.clsCbClsExtra], 0
mov [wc.clsCbWndExtra], 0
mov eax, [hInst]
mov [wc.clsHInstance], eax
push L IDI_APPLICATION
push L 0
call LoadIconA
mov [wc.clsHIcon], eax
push L IDC_ARROW
push L 0
call LoadCursorA
mov [wc.clsHCursor], eax
mov [wc.clsHbrBackground], COLOR_WINDOW + 1
mov dword ptr [wc.clsLpszMenuName],0
mov dword ptr [wc.clsLpszClassName], offset szClassName
push offset wc
call RegisterClassA
call CreateMenu
mov [hMenu],eax
push L 0 ; lpParam
push [hInst] ; hInstance
push [hMenu] ; menu
push L 0 ; parent hwnd
push L CW_USEDEFAULT ; height
push L CW_USEDEFAULT ; width
push L CW_USEDEFAULT ; y
push L CW_USEDEFAULT ; x
push L WS_OVERLAPPEDWINDOW ; Style
push offset szTitleName ; Title string
push offset szClassName ; Class name
push L 0 ; extra style
call CreateWindowExA
mov [newhwnd], eax
call CreatePopupMenu
mov [hsubmenu], eax
push offset item2
push L IDM_QUIT
push 0
push eax
call AppendMenuA
push offset item3
push L IDM_ABOUT
push 0
push [hsubmenu] ;eax
call AppendMenuA
push offset item1
push [hsubmenu]
push MF_POPUP
push [hMenu]
call AppendMenuA
nop
push L SW_SHOWNORMAL
push [newhwnd]
call ShowWindow
push [newhwnd]
call UpdateWindow
push [newhwnd]
call DrawMenuBar
msg_loop:
push L 0
push L 0
push L 0
push offset msg
call GetMessageA
cmp ax, 0
je end_loop
push offset msg
call TranslateMessage
push offset msg
call DispatchMessageA
jmp msg_loop
end_loop:
push [msg.msWPARAM]
call ExitProcess
;----Îêîííàÿ ïðîöåäóðà----
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD,\
wparam:DWORD, lparam:DWORD
LOCAL hDC:DWORD
cmp [wmsg], WM_DESTROY
je wmdestroy
cmp [wmsg], WM_SIZE
je wmsize
cmp [wmsg], WM_CREATE
je wmcreate
cmp [wmsg],WM_PAINT
je wmpaint
;**************************************
cmp [wmsg],WM_COMMAND
je wmcommand
;**************************************
jmp defwndproc
wmcommand:
mov eax,lparam
cmp ax,0
jne m1
mov eax,wparam
cmp ax,IDM_ABOUT
jne m2
call MessageBoxA,0,offset szHello,offset szAppName,MB_OK
jmp m1
m2: cmp ax,IDM_QUIT
jne m1
push 0
call PostQuitMessage
m1: mov eax,0
jmp finish
wmcreate:
mov eax, 0
jmp finish
defwndproc:
push [lparam]
push [wparam]
push [wmsg]
push [hwnd]
call DefWindowProcA
jmp finish
wmdestroy:
push L 0
call PostQuitMessage
mov eax, 0
jmp finish
wmsize:
mov eax, 0
jmp finish
wmpaint:
push offset lppaint
push [hwnd]
call BeginPaint
mov [hDC],eax
push offset lppaint
push [hwnd]
call EndPaint
mov eax,0
jmp finish
finish:
ret
WndProc endp
;---------------------------------
public WndProc
end start ; êîíåö ïðîãðàììû
ðèñ1. Îêíî ïðîãðàììû
Ìîÿ çàäà÷à ñîñòîÿëà â ñîçäàíèè ïðîãðàììû áåç ôàéëà îïèñàíèÿ ðåñóðñîâ ñ ïîìîùüþ ôóíêöèé CreateMenu è CreatePopupMenu. Ýòî ïðèëîæåíèå íå âûïîëíÿåò íèêàêîé ïîëåçíîé ðàáîòû è ñëóæèò äëÿ äåìîíñòðàöèè íåêîòîðûõ âîçìîæíîñòåé ñèñòåìû â îðãàíèçàöèè èíòåðôåéñà ïîëüçîâàòåëÿ.
Çóáêîâ Ñ.Â. Assembler. Äëÿ DOS Windows è Unix. Ì.: ÄÌÊ, 1999
Ïóñòîâàðîâ Â.È. ÀÑÑÅÌÁËÅÐ. Ïðîãðàììèðîâàíèå è àíàëèç êîððåêòíîñòè ìàøèííûõ ïðîãðàìì.
Ïðèìåíåíèå TURBO ASSEMBLER äëÿ ïðîãðàììèðîâàíèÿ ÏÝÂÌ. ×àñòü1,2.: Ìåòîäè÷åñêèå óêàçàíèÿ ê ëàáîðàòîðíîìó ïðàêòèêóìó ïî äèñöèïëèíå : «Ñèñòåìíîå ïðîãðàììíîå îáåñïå÷åíèå» / Ñîñòàâèòåëü Â.Ï.Êóëþêèí. Åêàòåðèíáóðã: èçä. ÈÏÊ ÓÃÒÓ, 2000.