2017-01-08本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6262353.html
菜单栏、工具栏和状态栏是组成Windows程序图形界面的三个主要元素。
一些基本概念总结:
弹出式菜单:MFC中属性设置为Pop-up类型的菜单。
如下图示File菜单的Popup属性设置为True,说明它是一个弹出式菜单。Visual C++默认顶层菜单为弹出式菜单,这种菜单不能响应命令,但顶层菜单并非只能是弹出式菜单,其取决于Popup属性设置。
资源:在MFC中,资源就是一种可供Windows应用程序动态加载利用,而且可单独编译的数据。Visual C++ 支持的资源有加速键、位图、光标、对话框、HTML、图标、菜单、串表、工具条和版本信息等。
资源的命名规则:与MFC保持一致,一般采用大写字母标识资源ID,更近一步地,为了明确资源类型,在“ID”字符串后加一个标识资源类型的字母,常用的有:菜单(MENU)资源ID号以“IDM_”开始,光标(CURSOR)资源ID号以“IDC_”开始,图标(ICON)资源ID号以“IDI_”开始。如下表是一些常用资源标识符前缀:
标识符前缀 |
说 明 |
标识符前缀 |
说 明 |
IDR_ |
主菜单、工具栏、加速键表和应用程序图标 |
IDS_ |
字符串 |
IDD_ |
对话框 |
IDP_ |
消息框提示字符串 |
IDC_ |
控件和光标 |
ID_ |
菜单命令 |
菜单命令响应函数的添加方法:
在菜单栏添加Test菜单,设置Popup属性为False,将其ID设置为IDM_TEST。
打开Project 菜单下的Class Wizard,弹出MFC Class Wizard对话框,
为了在框架类中响应此菜单命令,Class name应选择CMainFrame,Object IDs列表中选择IDM_TEST,(可以通过Search Commands快速找到此ID),在Messages中选择COMMAMD,然后单击Add Handler添加消息处理,如图弹出Add Member Function对话框所示,此处显示了详细信息。
单击OK,回到MFC Class Wizard对话框会发现Member functions中多了一个刚添加的函数。
单击Edit Code可以跳转到OnTest函数的定义处。添加如下代码:
MessageBox(TEXT("MainFrame Clicked"));
Build并运行程序,单击Test菜单会弹出一个显示了MainFrame Clicked消息的消息框。
菜单命令响应函数添加之后,程序中多了哪些与菜单命令消息响应函数相关的信息?
我们为View类添加Test菜单项的命令响应函数。添加之后,在程序中添加了三处与此相关的信息:
第一处:在视类的头文件中,添加了命令消息响应函数原型。
afx_msg void OnTest();
第二处和第三处:在视类的源文件中,添加了宏和命令消息响应函数实现代码。
//宏
BEGIN_MESSAGE_MAP(CMenuView, CView)
...
ON_COMMAND(IDM_TEST, &CMenuView::OnTest)
END_MESSAGE_MAP()
//命令消息响应函数实现代码
void CMenuView::OnTest()
{
// TODO: Add your command handler code here
}
菜单命令的路由:
响应菜单项命令的顺序依次是:视类、文档类、框架类,最后是应用程序类。
菜单命令消息路由的具体过程:
当点击某个菜单项时,最先接收到这个菜单命令消息的是框架类。框架类将把接收到的这个消息交给它的子窗口,即视类,由视类首先进行处理。视类首先根据命令消息映射机制查找自身是否对此消息进行了相应,如果响应了,就调用相应函数对这个消息进行处理,消息路由过程结束;如果没有对此命令消息做出响应,就交由文档类,文档类同样查找自身是否对这个菜单命令进行了响应,如果响应了,就有文档类的命令消息响应函数进行处理,路由过程结束。如果文档类也未做出响应,就把这个命令交还给视类,后者又把该消息交还给框架类,框架类查看自己是否对这个命令消息进行了相应,如果它也没有做出响应,就把这个菜单命令消息交给应用程序类,有后者来进行处理。
Windows消息的分类:
在Windows中,消息分为三类:
①标准消息:除WM_COMMAND之外,所有以WM_开头的消息。
②命令消息:来自菜单、加速键或工具栏按钮的消息,这类消息都以WM_COMMAND形式呈现。
③通告消息:由控件产生的消息,例如按钮的单击、列表框的选择等都会产生此类消息。目的是为了向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现。
如果有疑问,可以联系[email protected],更多内容请参考:http://www.cnblogs.com/mxbs/,技术交流请加QQ群:586571286。