创建载入菜单
wndcls.lpszMenuName=MAKEINTRESOURCE(IDM_MENU),也可用LoadMenu(hInstance,MAKEINTreSOURCE(IDM_MENU)),后者要在CreateWindow中传入菜单句柄或者在窗口创建后调用SetMenu(hwnd,hMenu)。挂在窗口上的菜单在结束时都会被销毁,所有没有挂在窗口的菜单在程序结束前都要用DestroyMenu销毁。
菜单消息
WM_INITMENU:在选择菜单前发送的消息,一般不做修改。wParam是主菜单句柄。
WM_MENUSELECT:当鼠标移过菜单项发送。wParam低字是菜单项ID或弹出菜单索引,高字是选项标志,与MF_宏使用;lParam是菜单所在菜单栏句柄。这个消息用在当鼠标移动过菜单时在状态栏提示菜单功能。
WM_INITMENUPOPUP:弹出菜单显示前发送。如果要在菜单显示前禁用或允许一些菜单,这个消息很重要。
WM_COMMAND:最重要的一条消息。wParam低字是菜单ID,其他都为0。lParam可以区分菜单命令消息和换件命令消息。
WM_SYSCOMMAND:和WM_COMMAND很像,是点系统菜单产生的消息,lParam是鼠标的系统坐标(低x高y)。
WM_MENUCHAR:当快捷键没有对应的菜单时发送。wParam低位是字符的ASCII或Unicode码,高位是标志,lParam是菜单句柄。
系统菜单
创建窗口时使用WS_SYSMENU就会有系统菜单,它在窗口标题栏左侧,鼠标单击显示。用GetSysMenu(hwnd,FALSE)得到菜单句柄并允许修改菜单,第二个参数为TRUE则恢复系统菜单且不允许修改。系统菜单命令消息是WM_SYSCOMMAND,菜单ID大于0XF000,因而
自定义ID应小于0XF000,避免混淆。
函数
GetMenu(hwnd);
CheckMenuItem(hMenu,iSelection,MF_CHECKED/MF_UNCHECKED);
CheckMenuItem(hMenu,iPos,iCheck | MF_BYPOSTION):第二参数为菜单项索引。
EnableMenuItem(hMenu,ID/iPos,MF_GRAYED/MF_ENABLED | MF_BYPOSTION):对禁用/允许弹出菜单操作只能用索引。
CreateMenu():与AppendMenu动态创建菜单
AppendMenu(hMenu,MF_STRING,IDM_MENUITEM,"&TEXT");
LoadMenuIndirect:接受MENUITEMTEMPLATE结构体指针,把参数保存在结构体数组中,直接创建菜单,比CreateMenu方便一些。
GetSubMenu(hMenu,iPos):返回弹出菜单句柄。
TrackPopupMenu(hMenu,TPM_RIGHTBUTTON,pt.x,pt.y,0,hwnd,NULL):创建鼠标右键菜单。hMenu必须是一个弹出菜单句柄。pt是屏幕坐标。
InsertMenu(hMenu,uPos,uFlag,uIDItem,lpNewItem)
ModifyMenu(hMenu,uPos,uFlag,uIDNew,lpNewItem)
DeleteMenu
RemoveMenu:不能销毁弹出菜单。
DrawMenuBar(hwnd):当顶级菜单修改后,Windows不会立刻显示改变的内容,可以用这个函数重绘菜单栏。
GetMenuItemCount(hMenu)
GetMenuItemID(hMenuPopup,iPos):返回菜单项ID
GetMneuString(hMenu,id,pString,iMaxString,iFlag):iFlag是MF_BYCOMMAND(ID)或MF_BYPOSTION(索引)
GetMenuState(hMenu,id,iFlag):iFlag同上。
快捷键
LoadAccelerators(hInstance,TEXT("MYACCELERATORS"));
TranslateAccelerator(hwnd,hAccel,&msg):快捷键消息转换,使用方法: 。菜单名称后加/t快捷键提示。
如果快捷键ID对应系统菜单的菜单项,TranslateAccelerator转换成的是WM_SYSCOMMAND,否则转换为WM_COMMAND消息。快捷键消息与菜单消息的区别在于wParam的高字为1,与控件的区别在与lParam是0。