Àññåìáëåð è Win32

         

Îêîííîå ïðèëîæåíèå


Ôàéë 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

Ñîäåðæàíèå ðàçäåëà