;运行效果
;win32汇编环境,对话框中使用菜单示例三
;鼠标点击右键时,弹出菜单的功能
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义
ICO_MAIN equ 1000 ;图标
IDM_021 equ 21
IDM_022 equ 22
IDM_023 equ 23
IDM_024 equ 24
IDM_025 equ 25
IDM_026 equ 26
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data
DlgName db "MyDialog",0
szMsg db "提示",0
szMen21 db "点击了菜单: 功能01",0
szMen25 db "点击了子菜单: 功能05",0
.data?
hInstance HINSTANCE ?
hRootMenu HMENU ?
hSubMenu HMENU ? ;要右键单击时弹出的菜单的句柄
.const
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL
invoke ExitProcess,eax
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL @stPos:POINT ;定义一个POINT结构变量,就是鼠标点击时,保存坐标点用的
LOCAL @hAccelerator
.if uMsg == WM_INITDIALOG
invoke LoadIcon,hInstance,ICO_MAIN
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
invoke GetMenu,hWnd
mov hRootMenu,eax
invoke GetSubMenu,hRootMenu,0 ;0是在顶层菜单中的索引,就是第1竖栏菜单。如果是第2栏,则为1,以此类推
mov hSubMenu,eax
.elseif uMsg == WM_COMMAND
mov eax,wParam ;wParam的底位字节是标识符
.if ax == IDM_021
invoke MessageBox,NULL,addr szMen21,addr szMsg,MB_OK
.elseif ax == IDM_023
invoke EnableMenuItem,hRootMenu, IDM_022,MF_ENABLED ;使禁用的菜单变有效
.elseif ax == IDM_024
invoke EnableMenuItem,hRootMenu, IDM_023,MF_ENABLED ;使灰化的菜单变有效
.elseif ax == IDM_025
invoke MessageBox,NULL,addr szMen25,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_CLOSE
invoke EndDialog, hWnd,NULL
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
DlgProc endp
end start
;下面为rc文件内容
#include "resource.h" //提示缺少该文件,可以在资源里下载
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define DIALOG_MAIN 1 //主对话框标识符
#define ICO_MAIN 1000 //图标
#define IDM_021 21
#define IDM_022 22
#define IDM_023 23
#define IDM_024 24
#define IDM_025 25
#define IDM_026 26
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN ICON "Main.ico"
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//定义对话框
MyDialog DIALOG 10, 10, 205, 100
STYLE DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK
CAPTION "对话框程序模版"
FONT 12, "方正姚体"
MENU IDM_MAIN //将菜单条加入对话框
BEGIN
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
IDM_MAIN menu discardable //discardable是当系统不需要时会自动释放资源
BEGIN
popup "命令(&C)"
BEGIN
menuitem "功能01",IDM_021
menuitem "被禁用的菜单项",IDM_022,INACTIVE //加 INACTIVE 为禁用状态
menuitem "被灰化的菜单项",IDM_023,GRAYED //加 GRAYED 为灰化状态
menuitem "使上面的禁用有效",IDM_023
menuitem "使上面的灰化有效",IDM_024
popup "工具栏" //加子菜单
BEGIN
menuitem "功能05",IDM_025
menuitem "功能06",IDM_026
END
END
END
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>