|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include gdi32.inc
includelib user32.lib
includelib gdi32.lib
includelib kernel32.lib
ICO_MAIN equ 1000h ;图标
IDM_MAIN equ 2000h ;菜单
IDA_MAIN equ 2000h ;加速键
IDM_OPEN equ 4101h
IDM_OPTION equ 4102h
IDM_EXIT equ 4103h
IDM_SETFONT equ 4201h
IDM_SETCOLOR equ 4202h
IDM_INACT equ 4203h
IDM_GRAY equ 4204h
IDM_BIG equ 4205h
IDM_SMALL equ 4206h
IDM_LIST equ 4207h
IDM_DETAIL equ 4208h
IDM_TOOLBAR equ 4209h
IDM_TOOLBARTEXT equ 4210h
IDM_INPUTBAR equ 4211h
IDM_STATUSBAR equ 4212h
IDM_HELP equ 4301h
IDM_ABOUT equ 4302h
.data?
hmenu dd ?
hInstance dd ?
hWindMain dd ?
haccelerator dd ?
hSubmenu dd ?
.const
szclassname db 'my class',0
szcaptionname db '练习程序',0
szformat db "你选择了程序:%08x",0
.code
_DESPLAYMENUITEM proc _dwcommandid
local szbuffer[256]:BYTE
pushad
invoke wsprintf,addr szbuffer,addr szformat,_dwcommandid
invoke MessageBox,hWindMain,addr szbuffer,offset szcaptionname,MB_OK
popad
ret
_DESPLAYMENUITEM endp
_QUIT PROC
pushad
invoke DestroyWindow,hWindMain
invoke PostQuitMessage,NULL
popad
ret
_QUIT endp
WIN_MAINPROC proc uses ebx esi edi ebp,hWnd,uMsg,wParam,lParam
local @stPos:POINT
local @hSysMenu
mov eax,uMsg
.if eax==WM_CREATE
invoke GetSubMenu,hmenu,1
mov hSubmenu,eax
.elseif eax== WM_COMMAND
mov eax,wParam
invoke _DESPLAYMENUITEM,ax
.if ax==IDM_EXIT
INVOKE _QUIT
.elseif eax>=IDM_TOOLBAR && eax<IDM_STATUSBAR
mov ebx,eax
invoke GetMenuState,hmenu,ebx,MF_BYCOMMAND
.if eax==MF_CHECKED
mov eax,MF_UNCHECKED
.else
mov eax,MF_CHECKED
.endif
invoke GetMenuState,hmenu,ebx,eax
.elseif eax>=IDM_BIG && eax<=IDM_DETAIL
invoke CheckMenuRadioItem,hmenu,IDM_BIG,IDM_DETAIL,eax,MF_BYCOMMAND
.endif
.elseif eax== WM_SYSCOMMAND
mov eax,wParam
.if ax==IDM_HELP||ax==IDM_ABOUT
invoke _DESPLAYMENUITEM,wParam
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
.elseif eax==WM_RBUTTONDOWN
invoke GetCursorPos,addr @stPos
invoke TrackPopupMenu,hSubmenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
.elseif eax==WM_CLOSE
call _QUIT
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WIN_MAINPROC endp
_WINMAIN proc
local @hwndclass:WNDCLASSEX
local @hMsg:MSG
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke RtlZeroMemory,addr @hwndclass,sizeof @hwndclass
invoke LoadMenu,hInstance,IDM_MAIN
mov hmenu,eax
invoke LoadAccelerators,hInstance,IDM_MAIN
mov haccelerator,eax
push hInstance
pop @hwndclass.hInstance
mov @hwndclass.cbSize,sizeof WNDCLASSEX
mov @hwndclass.style,CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov @hwndclass.hbrBackground,COLOR_WINDOW +1
mov @hwndclass.lpszClassName,offset szclassname
mov @hwndclass.lpfnWndProc,offset WIN_MAINPROC
invoke CreateWindowEx,WS_EX_PALETTEWINDOW,addr szclassname,addr szcaptionname,WS_OVERLAPPED,100,200,300,500,NULL,hmenu,\
hInstance,NULL
mov hWindMain,eax
invoke ShowWindow,hWindMain,SW_SHOWNORMAL
invoke UpdateWindow,hWindMain
.while TRUE
invoke GetMessage,addr @hMsg,NULL,0,0
.break .if eax==0
invoke TranslateAccelerator,hWindMain,haccelerator,addr @hMsg
.if eax==0
invoke TranslateMessage,addr @hMsg
invoke DispatchMessage,addr @hMsg
.endif
.endw
ret
_WINMAIN endp
start:
call _WINMAIN
invoke ExitProcess,NULL
end start |
|