VC菜单编程知识汇总
1.菜单编程的几个术语
顶层菜单-----出现在窗口顶端的菜单栏
顶层菜单项---顶层菜单里面的命令项(菜单项)
下拉菜单-----顶层菜单项被单击时出现的菜单
弹出菜单-----这种菜单很像下拉菜单,但是可以在屏幕任意位置弹出
菜单项-------出现菜单里的命令项
1.用编程方法创建菜单调用CreateMenu、InsertMenu和其他CMenu函数讲个部分连接起来
2.将一系列定义菜单内容的数据结构(MENUITEMTEMPLATE)初始化,并用CMenu::LoadMenuIndirect创建菜单
3.创建菜单资源,并在应用程序运行时加载生成的菜单
1.将菜单挂接到窗口的方法是将菜单的资源ID传递给CFrameWnd::Create
2.将菜单挂接到窗口的方法是用CFrameWnd::LoadFrame函数
3.构造一个CMenu对象,调用CMenu::LoadMenu加载菜单资源,然后再调用CWnd::SetMenu设置菜单
用户打开一个下拉菜单,菜单挂接的窗口就会收到一系列消息。首先传来的是WM_ITEMMENU消息,通知窗口选中一个最高级菜单项。在显示子菜单之前,窗口收到消息。有时Windows程序趁这个时候更新子菜单的菜单项,例如:在菜单项添加复选标记。在加亮条上下移动时,窗口接到WM_MENUSELECT消息,报告加亮条在菜单中的最新位置。选中菜单项时发送的WM_COMMAND消息。消息的参数wParam的低位字节保留所选菜单项的ID。
5.响应菜单命令范围
有时候用单个命令处理程序处理一组菜单项ID要比为每个ID提供一个独立成员函数更好些。在这种情况下,我们可以使用MFC ON_COMMAND_RANGE宏。
6.更新菜单中的菜单项
在应用程序中,必须不断更新菜单中的菜单项,例如,在某个菜单项前加复选标记。通常有两种方法:一,通过编程实现。二,利用MFC更新菜单项机制。通过消息映射表的ON_UPDATE_COMMAND_UI宏,可以给每个菜单项都提供更新函数,也可以利用MFC ON_UPDATA_COMMAND_RANGE宏为一组菜单项提供一个更新函数。
单击鼠标右键后,在响应WM_RBUTTONDOWN消息之前会响应WM_CONTEXTMENU消息,Windows很容易实现上下文菜单的创建。我们可以在响应WM_CONTEXTMENU消息的函数中,利用MFC的CMenu::TrackPopupMenu显示一个子菜单。
VC菜单编程--创建菜单
详细讲解如何创建菜单
第一种方法:
第二种方法:
VC编程菜单--Menu常用的成员函数
1.BOOL CreateMenu();
创建一个空的菜单,并将其附加到 CMenu 对象
2.BOOL CreateMenu();
创建一个空的弹出菜单,并将其附加到 CMenu 对象
3.BOOL LoadMenu(UINT nIDResource);
加载菜单上的资源,并将其附加到 CMenu 对象
4.static CMenu * PASCAL FromHandle(HMenu hMenu);
返回指向菜单的指针
5.BOOL AppendMenu(UINT nFlag,UINT_PTR nIDNewItem=0,LPCTSTR lpstrNewItem=NULL);
在菜单的末尾添加一个新的菜单项
6.BOOL InsertMenu(UINT nPosition,UINT nFlag,UINT_PTR nIDNewItem=0,
在指定的位置插入菜单项
7.BOOL ModifyMenu(UINT nPosition,UINT nFlag,UINT_PTR nIDNewItem=0,
8.BOOL Attach(HMENU hMenu);
将现有的Windows菜单附加到CMenu对象上
9.HMENU Detach();
将Windows菜单从CMenu对象上分离,并返回该菜单的句柄
10.BOOL DeleteMenu(UINT nPosition,UINT nFlags)
将指定的菜单或菜单项删除
11.BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd,LPCRECT lpRect=0);
在指定的位置弹出上下文菜单
12.UINT CheckMenuItem(UINT nIDCheckItem,UINT nCheck);
在指定的菜单项加上复选标记或去掉复选标记
13.UINT GetMenuStae(UINT ID,UINT nFlags);
获得指定菜单项是否选中
14.UINT EnabledMenuItem(UINT nIDEnabletem,UINT nEnable);
指定菜单项是否可用
15.CMenu * GetSystemMenu(BOOL bRevert);
得到系统菜单的指针
VC编程菜单实例--在系统菜单中添加菜单项
实例说明:
系统菜单是用户右击标题栏(快捷键Alt+空格)时弹出的快捷菜单。如何在系统菜单上添加自己的菜单项呢?本实例将实现这个功能。
为了操作系统菜单,我们首先要获得系统菜单的句柄或指针,可以通过GetSystemMenu获得系统菜单的句柄或指针,然后用AppendMenu或InsertMenu添加一个菜单项,最后在系统对话框类的OnSysCommand方法中处理菜单项的命令。(函数的解释VC编程菜单--Menu常用的成员函数找到)。
1.新建一个基于对画框的应用程序
2.在对话框类中定义一个菜单指针m_pMenu,指向系统菜单
3.在对话框类中的OnInitDialog中添加以下代码
VC菜单编程实例--通过手工编程创建菜单
实例说明:
从应用程序资源模板加载菜单并不是唯一的方法(可以看前面的文章,有创建菜单的所有方法),可以用CMenu的成员函数编程创建菜单,优点是可以动态改变菜单。本实例就讲解如何动态创建菜单,这种方法是很有用的,一定要掌握哦
可以用CMenu::CreateMenu创建菜单,用CMenu::CreatePopupMenu创建子菜单,并用CMenu::AppendMenu将子菜单挂接到顶层菜单,最终形成一个顶层菜单和他的子菜单。
1.新建一个基于对画框的应用程序
2.在对话框类中的OnInitDialog中添加以下代码
添加对各个菜单项的响应
3.在对话框类头文件中添加消息响应函数的声明
4.在对话框类中如下添加消息映射
在对话框类中添加消息映射成员函数
(说明:CCreateMenuDlg是对话框类)
VC菜单编程--手工添加菜单项的命令响应
具体实现过程如下:
例子如下:(具体可以参考VC菜单编程实例--通过手工编程创建菜单)