一个菜单条总是属于一个窗口,当用户选定一个菜单项后,系统向菜单的父窗口发出消息,如果是普通菜单发送WM_COMMAND消息,如果是系统菜单发送WM_SYSCOMMAND消息。当鼠标悬浮在一个有下级菜单的菜单项上时,系统首先向菜单的父窗口发送WM_INITMENUPOPUP消息,然后展开子菜单。每一个菜单条由一个唯一的句柄指向,类型为HMENU。获得一个菜单的句柄使用GetMenu()函数,获得子菜单用GetSubMenu()、GetMenuItemInfo()。获得窗口的系统菜单句柄应当使用GetSystemMenu()。菜单除了句柄,还有ID,类似于按钮的ID,当菜单触发事件时,菜单ID被包含在WM_COMMAND或WM_SYSCOMMAND中一同发送。可以通过GetMenuItemID()获取一个菜单项的ID。访问菜单项时如果使用ID的方式会比较麻烦,一种变通的方法就是按照菜单项的以0为基数的索引进行访问,最左边的为0,向右逐次递增,最上边的为0,向下逐次递增。
一、 菜单的建立
1、 使用菜单资源
首先设计好菜单,然后用LoadMenu()加载,再用SetMenu()设置,例如,在窗口的WM_CREATE消息中:
HMENU hMenu; hMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_MENU1)); SetMenu(hWNd,hMenu); |
2、 内存菜单模板建立菜单
有的应用程序允许用户自定义菜单,这就要求使用内存菜单模板来定义菜单,然后用LoadMenuIndirect()函数加载这个内存菜单模板获得菜单句柄,内存菜单模板由两部分组成:一个MENUITEMTEMPLATEHEADER(或者MENUEX_TEMPLATE_HEADER)结构和若干个MENUITEMTEMPLATE(或者MENUEX_TEMPLATE_ITEM)结构
3、 CreateMenu()函数
CreateMenu()函数返回一个指向空菜单的HMENU指针,利用这个指针向其中添加菜单项InsertMenuItem()
二、 菜单的显示
1、 对于已经通过在WNDCLASSEX窗口类注册时指定hMenu成员或者调用SetMenu()函数为其设定了父窗口的菜单,窗口显示,菜单自动显示
2、 显示弹出菜单应使用TrackPopmenuEx()函数,例如
HMENU hpMemu; hpMenu=LoadMenu(hInst,MAKEINTRESOURCE(IDR_POPMENU); TrackePopmenuEx( hpMenu,//菜单的句柄 TPM_LEFTALIGN,//菜单和弹出点坐标的对齐方式 x,//弹出点X坐标 y,//弹出点Y坐标 hWnd,//父窗口句柄 NULL); |
3、 菜单显示过程中的消息
用户单击菜单栏上的一项,父窗口接收到WM_INITITEM消息(在这个消息中可以绘制菜单),然后弹出菜单。当鼠标指向一个可以弹出子菜单的菜单项时,父窗口接收到WM_INITMENUPOPUP(可捕获此消息绘制子菜单),然后弹出子菜单。当鼠标在菜单上移动时,父窗口接收到WM_MENUSELECT消息,该消息中包含有当前的菜单项的索引号,可以对其进行引用。单击一个菜单项,产生WM_COMMAND消息,单击一个风格为MNS_NOTIFYBYPOS的菜单项,产生WM_MENUCOMMAND消息,该消息除了提供WM_COMMAND消息提供的数据外还额外添加了一个MENUINFO结构。右键弹出菜单发送WM_CONTEXTMENU消息。用户在一个菜单项上右击鼠标将产生WM_MENURBUTTONUP消息(例如在IE的收藏菜单的菜单项上右击弹出菜单的效果就可以通过捕获该消息实现) <  
说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
1/2 1 2 下一页 尾页 |