win32汇编环境,窗口程序中使用菜单示例四
;运行效果
;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 "点击了菜单:功能01",0
szMen15 db "点击了子菜单: 功能05",0
szMen1 db "命令(&C)",0
szMen1_1 db "功能01",0
szMen1_2 db "被禁用的菜单项",0
szMen1_3 db "被灰化的菜单项",0
szMen1_4 db "使上面的禁用有效",0
szMen1_5 db "使上面的灰化有效",0
szMen1_6 db "工具栏",0
szMen1_6_1 db "功能05",0
szMen1_6_2 db "功能06",0
.DATA?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hRootMenu HMENU ?
hSubMenu HMENU ? ;要右键单击时弹出的菜单的句柄
hPopupMenu1 HMENU ?
hPopupMenu11 HMENU ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
IDM_011 equ 11
IDM_012 equ 12
IDM_013 equ 13
IDM_014 equ 14
IDM_015 equ 15
IDM_0161 equ 161
IDM_0162 equ 162
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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
LOCAL @stPos:POINT ;定义一个POINT结构变量,就是鼠标点击时,保存坐标点用的
.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
invoke AppendMenu,hPopupMenu1,MF_STRING + MF_DISABLED,IDM_012,addr szMen1_2 ;MF_DISABLED 是禁用风格
invoke AppendMenu,hPopupMenu1,MF_STRING + MF_GRAYED,IDM_013,addr szMen1_3 ;MF_GRAYED 是禁用且灰显状态
invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_014,addr szMen1_4
invoke AppendMenu,hPopupMenu1,MF_STRING,IDM_015,addr szMen1_5
invoke CreatePopupMenu
mov hPopupMenu11,eax
invoke AppendMenu,hPopupMenu1,MF_POPUP,hPopupMenu11,addr szMen1_6
invoke AppendMenu,hPopupMenu11,MF_STRING,IDM_0161,addr szMen1_6_1
invoke AppendMenu,hPopupMenu11,MF_STRING,IDM_0162,addr szMen1_6_2
invoke SetMenu,hWnd,hRootMenu
invoke GetSubMenu,hRootMenu,0 ;0是在顶层菜单中的索引,就是第1竖栏菜单。如果是第2栏,则为1,以此类推
mov hSubMenu,eax
.elseif uMsg == WM_COMMAND
mov eax,wParam ;wParam的底位字节是标识符
.if ax == IDM_011
invoke MessageBox,NULL,addr szMen11,addr szMsg,MB_OK
.elseif ax == IDM_014
invoke EnableMenuItem,hRootMenu, IDM_012,MF_ENABLED ;使禁用的菜单变有效
.elseif ax == IDM_015
invoke EnableMenuItem,hRootMenu, IDM_013,MF_ENABLED ;使灰化的菜单变有效
.elseif ax == IDM_0161
invoke MessageBox,NULL,addr szMen15,addr szMsg,MB_OK
.endif
.elseif uMsg == WM_RBUTTONDOWN ;WM_RBUTTONDOWN是鼠标右键点击的消息
invoke GetCursorPos,addr @stPos ;取得鼠标点击的坐标
invoke TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL ;在指定位置显示快捷菜单,并跟踪菜单上项的选择的函数
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
end start