;运行效果

;win32汇编环境,窗口程序中使用菜单示例一
;最基本的应用,即添加菜单及点击后响应的操作方法
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.DATA
ClassName db "SimpleWinClass",0
AppName db "窗口程序的模版",0
szMsg db "提示",0
szMen11 db "点击了菜单:开始",0
szMen21 db "点击了菜单: 功能01",0
szMen1 db "文件(&F)",0
szMen1_1 db "开始",0
szMen1_2 db "退出",0
szMen2 db "命令(&C)",0
szMen2_1 db "功能01",0
szMen2_2 db "功能02",0
szMen2_3 db "功能03",0
szMen3 db "帮助(&H)",0
szMen3_1 db "主题",0
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hRootMenu HMENU ?
hPopupMenu1 HMENU ?
hPopupMenu2 HMENU ?
hPopupMenu3 HMENU ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
IDM_011 equ 11 ;某顶的标识符
IDM_012 equ 12
IDM_021 equ 21
IDM_022 equ 22
IDM_023 equ 23
IDM_031 equ 31
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.CODE
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateWindowEx,NULL, ADDR ClassName,ADDR AppName,WS_OVERLAPPEDWINDOW,100,100,400,300, NULL,NULL,hInst, NULL
mov hwnd,eax
invoke ShowWindow, hwnd,CmdShow
invoke UpdateWindow, hwnd
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endw
mov eax,msg.wParam
ret
WinMain endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.if uMsg == WM_CREATE
invoke CreateMenu ;创建根菜单
mov hRootMenu,eax
invoke CreatePopupMenu ;创建下拉式菜单,//竖立的弹出菜单,通常作为另一个菜单的子菜单或右键菜单的顶级菜单
mov hPopupMenu1,eax
invoke AppendMenu,hRootMenu,MF_POPUP,hPopupMenu1,addr szMen1 ;把下拉式菜单添加到根菜单里去
invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_011,addr szMen1_1 ;给下拉式菜单加上第1项
invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_012,addr szMen1_2 ;给下拉式菜单加上第2项
invoke CreatePopupMenu
mov hPopupMenu2,eax
invoke AppendMenu,hRootMenu,MF_POPUP,hPopupMenu2,addr szMen2
invoke AppendMenu,hPopupMenu2,MF_STRING,IDM_021,addr szMen2_1
invoke AppendMenu,hPopupMenu2,MF_STRING,IDM_022,addr szMen2_2
invoke AppendMenu,hPopupMenu2,MF_STRING,IDM_023,addr szMen2_3
invoke CreatePopupMenu
mov hPopupMenu3,eax
invoke AppendMenu,hRootMenu,MF_POPUP,hPopupMenu3,addr szMen3
invoke AppendMenu,hPopupMenu3,MF_STRING,IDM_031,addr szMen3_1
invoke SetMenu,hWnd,hRootMenu
.elseif uMsg == WM_COMMAND
mov eax,wParam ;wParam的底位字节是标识符
.if ax == IDM_011
invoke MessageBox,NULL,addr szMen11,addr szMsg,MB_OK
.elseif ax == IDM_021
invoke MessageBox,NULL,addr szMen21,addr szMsg,MB_OK
.elseif ax == IDM_012
invoke PostQuitMessage,NULL
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start

1086

被折叠的 条评论
为什么被折叠?



