本文转载:http://blog.sina.com.cn/s/blog_3f56673a0100ajvk.html
第六章 菜单
6.1 菜单命令响应函数
无
#资源ID号知识:
以"IDM_"开头的是菜单资源
以"IDC_"开头的是光标资源
以"IDI_"开头的是图标资源
6.2 菜单命令的路由
6.2.1 程序类对菜单命令的响应顺序
响应菜单项命令的顺序依次是:视类,文档类,框架类,应用程序类。
6.2.2 Windows消息的分类
消息分为三类:
1.标准消息:以WM_开头的消息。
2.命令消息:来自菜单、工具栏的按钮、加速键的消息。
3.通告消息:有控件产生的消息
从CWnd派生的类,可以接收三类消息。
从CCmdTarget派生的类,只能接收命令消息和通告消息。
6.2.3 菜单命令的路由
消息的接收顺序和处理顺序是不同的。最先接收的是框架类。
标准消息的处理函数是消息映射函数。
命令消息的处理函数是 OnCommand函数。
通告消息的处理函数是 OnNotify函数。
6.3 基本菜单操作
6.3.1 标记菜单
========================================================================
#CWin的成员函数知识:
下面两个成员函数只需获得其对象的指针即可运行。
1.获取程序的菜单栏。
CMenu * GetMenu(); //返回菜单的指针
在框架类中可以直接调用,因为该成员函数的对象就是框架类对象。
2.获取一个菜单的子菜单。
CMenu * GetSubMenu( int nPos ) //返回子菜单的指针
可以用菜单的指针来调用。
========================================================================
为菜单项添加一个标记的函数:
UINT CheckMenuItem (索引号,索引方式);
框架类下:
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION | MF_CHECKED);
6.3.2 默认菜单项
框架类下:
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);
一个子菜单只能有一个默认菜单项。
分隔栏在子菜单中是占据索引位置的。
6.3.3 图形标记菜单
为菜单项添加一图形标记:
SetMenuItemBitmaps()
框架类下:
m_bitmap.LoadBitmap(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);
还需要知道图标的尺寸可以是多大。通过下面的函数可以获得:
int GetSystemMetrics( int nIndex );
当nIndex为SM_XMENUCHECK或SM_YMENUCHECK时,可以获得子菜单项目的尺寸
6.3.4 禁用菜单项
设置菜单项的使用、禁用或变灰显示。
EnableMenuItem();
框架类下:
GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION | MF_DISABLED);
还需要先把框架类成员变量m_bAutoMenuEnable变量设置为FALSE,才能更改菜单项目状态。
6.3.5 移除和装载菜单
装载一个菜单:(需要将新菜单定义为CMainFrame的成员变量)
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
移除一个菜单:
SetMenu(NULL)
#Detach函数
Detach函数会把句柄与对象分离,当这个局部对象的生命周期结束时,它不会再去销毁这个对象
6.3.6 MFC菜单命令更新机制
如果要在程序中设置某个菜单项的状态,首先通过ClassWiiard为这个菜单项添加UPDATE_COMMAND_UI消息响应函数,然后在这个函数中进行状态的设置即可。
如果要把工具栏上的一个工具按纽与菜单栏中的某个菜单项相关联,只要将他们的ID设置为同一个就行。
6.3.7 快捷菜单
单击鼠标右键显示的快捷菜单是一个ActiveX控件。它是位于VisualC++ Components目录下的"Pop-up Menu"组件。
制作快捷菜单的步骤:
1.插入ActiveX控件Pop-up Menu
2.制作Pop-up Menu资源
3.新建CMenu类
4.调用ClientToScreen(&point)把客户区坐标转换为屏幕坐标
5.调用CMenu类的成员函数TrackPopupMenu将快捷菜单显示出来
6.4 动态菜单操作
6.4.1 添加菜单项目
CMenu的成员函数:AppendMenu可以把一个新菜单项目添加到一个指定菜单项目的末尾。
代码如下:
CMenu menu;
menu.CreateMenu();
GetMenu()->AppendMenu(MF_POPUP,(UINT)menu.m_hMenu,"Test");
其中由于成员变量m_hMenu是HMENU类型的,而函数需要的是UINT类型的。但它们都是句柄,所以这
里可以进行强制转换。
6.4.2 插入菜单项目
CMenu的成员函数:InsertMenu()
6.4.3 删除菜单
CMenu的成员函数:DeleteMenu()
6.4.4 动态添加的菜单项的命令响应
步骤:
1.在Resource.h文件中自定义一个资源ID: #define IDM_HELLO 111
2.在Appendmenu中使用这个ID: menu.AppendMenu(MF_STRING,IDM_HELLO,"Hello");
3.在框架类中添加函数原形: afx_msg void OnHello();
4.消息映射表中天家消息映射:ON_COMMAND(IDM_HELLO,OnHello)
5.实现消息响应函数