Îêîííîå ïðèëîæåíèå
Ôàéë dmenu.asm
Ideal
P586
Radix 16
Model flat
struc WndClassEx
cbSize dd 0
style dd 0
lpfnWndProc dd 0
cbClsExtra dd 0
cbWndExtra dd 0
hInstance dd 0
hIcon dd 0
hCursor dd 0
hbrBackground dd 0
lpszMenuName dd 0
lpszClassName dd 0
hIconSm dd 0
ends WndClassEx
struc Point
left dd 0
top dd 0
right dd 0
bottom dd 0
ends Point
struc msgStruc
hwnd dd 0
message dd 0
wParam dd 0
lParam dd 0
time dd 0
pt Point <>
ends msgStruc
MyMenu = 0065
ID_OPEN = 9C41
ID_SAVE = 9C42
ID_EXIT = 9C43
CS_VREDRAW = 0001
CS_HREDRAW = 0002
IDI_APPLICATION = 7F00
IDC_ARROW = 7F00
COLOR_WINDOW = 5
WS_EX_WINDOWEDGE = 00000100
WS_EX_CLIENTEDGE = 00000200
WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE OR WS_EX_CLIENTEDGE
WS_OVERLAPPED = 00000000
WS_CAPTION = 00C00000
WS_SYSMENU = 00080000
WS_THICKFRAME = 00040000
WS_MINIMIZEBOX = 00020000
WS_MAXIMIZEBOX = 00010000
WS_OVERLAPPEDWINDOW = WS_OVERLAPPED OR \
WS_CAPTION OR \
WS_SYSMENU OR \
WS_THICKFRAME OR \
WS_MINIMIZEBOX OR \
WS_MAXIMIZEBOX
CW_USEDEFAULT = 80000000
SW_SHOW = 5
WM_COMMAND = 0111
WM_DESTROY = 0002
WM_CLOSE = 0010
MB_OK = 0
PROCTYPEààààà ptGetModuleHandleààà stdcallàààààà \
àààààààààààààààààààà lpModuleNameà :dword
PROCTYPEààààà ptLoadIconàààààààààà stdcallàààààà \
àààààààààààààààààààà hInstanceàààà :dword,àààààà \
àààààààààààààààààààà lpIconNameààà :dword
PROCTYPEààààà ptLoadCursoràààààààà stdcallàààààà \
àààààààààààààààààààà hInstanceàààà :dword,àààààà \
àààààààààààààààààààà lpCursorNameà :dword
PROCTYPEààààà ptLoadMenuàààààààààà stdcallàààààà \
àààààààààààààààààààà hInstanceàààà :dword,àààààà \
àààààààààààààààààààà lpMenuNameààà :dword
PROCTYPEààààà ptRegisterClassExààà stdcallàààààà \
àààààààààààààààààààà lpwcxàààààààà :dword
PROCTYPEààààà ptCreateWindowExàààà stdcallàààààà \
àààààààààààààààààààà dwExStyleàààà :dword,àààààà \
àààààààààààààààààààà lpClassNameàà :dword,àààààà \
àààààààààààààààààààà lpWindowNameà :dword,àààààà \
àààààààààààààààààààà dwStyleààààààààààààà :dword,àààààà \
àààààààààààààààààààà xàààààààààààà :dword, \
àààààààààààààààààààà yàààààààààààà :dword,àààààà \
àààààààààààààààààààà nWidthààààààà :dword,àààààà \
àààààààààààààààààààà nHeightààààààààààààà :dword,àààààà \
àààààààààààààààààààà hWndParentààà :dword,àààààà \
àààààààààààààààààààà hMenuàààààààà :dword, \
àààààààààààààààààààà hInstanceàààà :dword,àààààà \
àààààààààààààààààààà lpParamààààààààààààà :dword
PROCTYPEààààà ptShowWindowàààààààà stdcallàààààà \
àààààààààààààààààààà hWndààààààààà :dword,àààààà \
àààààààààààààààààààà nCmdShowààààà :dword
PROCTYPEààààà ptUpdateWindowàààààààààààà stdcallàààààà \
àààààààààààààààààààà hWndààààààààà :dword
PROCTYPEààààà ptGetMessageàààààààà stdcallàààààà \
àààààààààààààààààààà pMsgààààààààà :dword,àààààà \
àààààààààààààààààààà hWndààààààààà :dword,àààààà \
àààààààààààààààààààà wMsgFilterMin :dword,àààààà \
àààààààààààààààààààà wMsgFilterMax :dword
PROCTYPEààààà ptTranslateMessageàà stdcallàààààà \
àààààààààààààààààààà lpMsgàààààààà :dword
PROCTYPEààààà ptDispatchMessageààà stdcallàààààà \
àààààààààààààààààààà pmsgààààààààà :dword
PROCTYPEààààà ptSetMenuààààààààààà stdcallàààààà \
àààààààààààààààààààà hWndààààààààà :dword,àààààà \
àààààààààààààààààààà hMenuàààààààà :dword
PROCTYPEààààà ptPostQuitMessageààà stdcallàààààà \
àààààààààààààààààààà nExitCodeàààà :dword
PROCTYPEààààà ptDefWindowProcààààààààààà stdcallàààààà \
àààààààààààààààààààà hWndààààààààà :dword,àààààà \
àààààààààààààààààààà Msgàààààààààà :dword,àààààà \
àààààààààààààààààààà wParamààààààà :dword,àààààà \
àààààààààààààààààààà lParamààààààà :dword
PROCTYPEààààà ptSendMessageààààààà stdcallàààààà \
àààààààààààààààààààà hWndààààààààà :dword,àààààà \
àààààààààààààààààààà Msgàààààààààà :dword,àààààà \
àààààààààààààààààààà wParamààààààà :dword,àààààà \
àààààààààààààààààààà lParamààààààà :dword
PROCTYPEààààà ptMessageBoxàààààààà stdcallàààààà \
àààààààààààààààààààà hWndààààààààà :dword,àààààà \
àààààààààààààààààààà lpTextààààààà :dword,àààààà \
àààààààààààààààààààà lpCaptionàààà :dword,àààààà \
àààààààààààààààààààà uTypeàààààààà :dword
PROCTYPEààààà ptExitProcessààààààà stdcallàààààà \
àààààààààààààààààààà exitCodeààààà :dword
extrnàààààààà GetModuleHandleAàààà :ptGetModuleHandle
extrnàààààààà LoadIconAààààààààààà :ptLoadIcon
extrnàààààààà LoadCursorAààààààààà :ptLoadCursor
extrnàààààààà RegisterClassExAàààà :ptRegisterClassEx
extrnàààààààà LoadMenuAààààààààààà :ptLoadMenu
extrnàààààààà CreateWindowExAààààààààààà :ptCreateWindowEx
extrnàààààààà ShowWindowàààààààààà :ptShowWindow
extrnàààààààà UpdateWindowàààààààà :ptUpdateWindow
extrnàààààààà GetMessageAààààààààà :ptGetMessage
extrnàààààààà TranslateMessageàààà :ptTranslateMessage
extrnàààààààà DispatchMessageAàààà :ptDispatchMessage
extrnàààààààà SetMenuààààààààààààààààààà :ptSetMenu
extrnàààààààà PostQuitMessageààààààààààà :ptPostQuitMessage
extrnà àààààà DefWindowProcAàààààààààààà :ptDefWindowProc
extrnàààààààà SendMessageAàààààààà :ptSendMessage
extrnàààààààà MessageBoxAààààààààà :ptMessageBox
extrnàààààààà ExitProcessààààààààà :ptExitProcess
UDataSeg
hInstàààààààà ddààààààààààà ?
hWndààààààààà ddààààààààààà ?
IFNDEF VER1
hMenuàààààààà ddààààààààààà ?
ENDIF
DataSeg
msgàààààààààà msgStrucààààà <>
classTitleààà dbàààà 'Menu demo', 0
wndTitleààààà dbàààà 'Demo program', 0
msg_open_txtà dbàààà 'You selected open', 0
msg_open_tltà dbàààà 'Open box', 0
msg_save_txtà dbàààà 'You selected save', 0
msg_save_tltà dbàààà 'Save box', 0
CodeSeg
Start: callàà GetModuleHandleA,ààà 0ààààà ; ýõ þñ ÷ðªõû¹ýþ, ýþ öõûðªõû¹ýþ
àààààà movààà [hInst],eax
àààààà subààà esp,SIZE WndClassExààààààà ; þªòõô¬ü üõ¸ªþ ò ¸ªõúõ ÿþô ¸ª¨ºúªº¨º
àààààà movààà [(WndClassEx esp).cbSize],SIZE WndClassEx
àààààà movààà [(WndClassEx esp).style],CS_HREDRAW or CS_VREDRAW
àààààà movààà [(WndClassEx esp).lpfnWndProc],offset WndProc
àààààà movààà [(WndClassEx esp).cbWndExtra],0
àààààà movààà [(WndClassEx esp).cbClsExtra],0
àààààà movààà [(WndClassEx esp).hInstance],eax
àààààà callàà LoadIconA,àààààààààà 0, IDI_APPLICATION
àààààà movààà [(WndClassEx esp).hIcon],eax
àààààà callàà LoadCursorA,àààààààà 0, IDC_ARROW
àààààà movààà [(WndClassEx esp).hCursor],eax
àààààà movààà [(WndClassEx esp).hbrBackground],COLOR_WINDOW
IFDEFà VER1
àààààà movààà [(WndClassEx esp).lpszMenuName],MyMenu
ELSE
àààààà movààà [(WndClassEx esp).lpszMenuName],0
ENDIF
àààààà movààà [(WndClassEx esp).lpszClassName],offset classTitle
àààààà movààà [(WndClassEx esp).hIconSm],0
àààààà callàà RegisterClassExA,ààà espààà ; ÷ð¨õóø¸ª¨ø¨ºõü úû𸸠þúýð
àààààà addààà esp,SIZE WndClassExààààààà ; òþ¸¸ªðýþòøü ¸ªõú
àààààààààààààààààààààààààààààààààààààààà ; ø ¸þ÷ôðôøü þúýþ
IFNDEF VER2
àààààà callàà CreateWindowExA,àààà WS_EX_OVERLAPPEDWINDOW,
\ extended window style
ààààààààààààààààààààààààààààààààà offset classTitle, \ pointer to registered class name
ààààààààààààààààààààààààààààààààà offset wndTitle,\ pointer to window name
ààààààààààààààààààààààààààààààààà WS_OVERLAPPEDWINDOW, \ window style
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ horizontal position of window
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ vertical position of window
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ window width
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ window height
àààààà àààààààààààààààààààààààààà 0,ààààààààààà \ handle to parent or owner window
ààààààààààààààààààààààààààààààààà 0,àààà \ handle to menu, or child-window identifier
ààààààààààààààààààààààààààààààààà [hInst],ààààà \ handle to application instance
ààààààààààààààààààààààààààààààààà 0àààààààààààà ; pointer to window-creation data
ELSE
àààààà callàà LoadMenu,ààààààààààà hInst, MyMenu
àààààà movààà [hMenu],eax
àààààà callàà CreateWindowExA,àààà WS_EX_OVERLAPPEDWINDOW,ààà \ extended window style
ààààààààààààààààààààààààààààààààà offset classTitle, \ pointer to registered class name
ààààààààààààààààààààààààààààààààà offset wndTitle,àààà \ pointer to window name
ààààààààààààààààààààààààààààààààà WS_OVERLAPPEDWINDOW, \ window style
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ horizontal position of window
àààààààààààààààààààà ààààààààààààà CW_USEDEFAULT,àààààà \ vertical position of window
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ window width
ààààààààààààààààààààààààààààààààà CW_USEDEFAULT,àààààà \ window height
ààààààààààààààààààààààààààààààààà 0,ààààààààààà \ handle to parent or owner window
ààààààààààààààààààààààààààààààààà eax,àà \ handle to menu, or child-window identifier
ààààààààààààààààààààààààààààààààà [hInst],ààààà \ handle to application instance
ààààààààààààààààààààààààààààààààà 0àààààààààààà ; pointer to window-creation data
ENDIF
àààààà movààà [hWnd],eax
àààààà callàà ShowWindow,ààààààààà eax, SW_SHOWàààààààà ; show window
àààààà callàà UpdateWindow,ààààààà [hWnd]àààààààààààààà ; redraw window
IFDEFà VER3
àààààà callàà LoadMenuA,àààààààààà [hInst], MyMenu
àààààà movààà [hMenu],eax
àààààà callàà SetMenu,àààààààààààà [hWnd], eax
ENDIF
msg_loop:
àààààà callàà GetMessageA,àààààààà offset msg, 0, 0, 0
àààààà oràààà ax,ax
àààààà jzàààà exit
àààààà callàà TranslateMessage,ààà offset msg
àààààà callàà DispatchMessageA,ààà offset msg
àààààà jmpààà msg_loop
exit:à callàà ExitProcess,àààààààà 0
public stdcallàààààà WndProc
procàà WndProcàààààà stdcall
argààà @@hwnd:àààààà dword, @@msg: dword, @@wPar:àààààà dword, @@lPar:àààààà dword
àààààà movààà eax,[@@msg]
àààààà cmpààà eax,WM_COMMAND
àààààà jeàààà @@command
àààààà cmpààà eax,WM_DESTROY
àààààà jneààà @@default
àààààà callàà PostQuitMessage,àààà 0
àààààà xorààà eax,eax
àààààà jmpààà @@ret
@@default:
àààààà callàà DefWindowProcA,ààààà [@@hwnd], [@@msg], [@@wPar], [@@lPar]
@@ret: ret
@@command:
àààààà movààà eax,[@@wPar]
àààààà cmpààà eax,ID_OPEN
àààààà jeàààà @@open
àààààà cmpààà eax,ID_SAVE
àààààà jeàààà @@save
àààààà callàà SendMessageA,ààààààà [@@hwnd], WM_CLOSE, 0, 0
àààààà xorààà eax,eax
àààààà jmpààà @@ret
@@open:àààààà movààà eax, offset msg_open_txt
àààààà movààà edx, offset msg_open_tlt
àààààà jmpààà @@mess
@@save:àààààà movààà eax, offset msg_save_txt
àààààà movààà edx, offset msg_save_tlt
@@mess:àààààà callàà MessageBoxA,àààààààà 0, eax, edx, MB_OK
àààààà xorààà eax,eax
àààààà jmpààà @@ret
endpàà WndProc
endààà Start