C++编程中的消息机制

来源:互联网 发布:杭州淘宝大学地址 编辑:程序博客网 时间:2024/05/02 02:43

消息映射:

BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏定义这个消息映射的边界。

BEGIN_MESSAGE_MAP()宏有两个参数,第一个参数为定义消息映射的当前类名,第二个参数提供一个到该基类的连接,以查找消息处理程序。如果在定义消息映射的类中没有发现消息处理程序,将搜索基类的消息映射。

以第一个为例:ON_COMMAND(ID_APP_ABOUT, &CmfcApp::OnAppAbout)表示将消息标识符为ID_APP_ABOUT的消息与函数OnAppAbout()建立映射,如果收到了一个对应于标识符ID_APP_ABOUT的消息时,将调用OnAppAbout()。

BEGIN_MESSAGE_MAP(CmfcApp, CWinAppEx)ON_COMMAND(ID_APP_ABOUT, &CmfcApp::OnAppAbout)// 基于文件的标准文档命令ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew)ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen)// 标准打印设置命令ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinAppEx::OnFilePrintSetup)END_MESSAGE_MAP()

消息的类别:



处理消息的程序放在哪里呢?

放置处理程序的许可位置取决于要处理的消息的类别。对于上面的前两种类别的消息,即标准Windows消息和控制通知消息来说,他们始终由派生于CWnd的类的对象处理。

处理命令消息则灵活的多,可以把这些消息房子程序中的应用程序类、文档类和文档模板类中。当然也可以放在窗口类和视图类中。所有的命令消息都发送到应用程序的主框架窗口,然后主框架窗口将按照一个特定的顺序把这个消息传送给程序中的类。如果一个类不处理这个消息,就传到下一个类,在SDI中具体顺序是①视图对象②文档对象③文档模板对象④主框架窗口对象⑤应用程序对象。在MDI中消息的传递顺序是:①活动视图对象②与活动视图相关联的文档对象③活动文档的文档模板对象④活动视图的框架窗口对象⑤主框架窗口对象⑥应用程序对象


下面以添加菜单和创建消息响应为例讲解下消息响应

1、菜单是在程序代码之外的资源文件中定义的:

     

如果想修改你的菜单项,非常的简单,双击mfc.rc或者转到资源视图,选择MENU,然后单开你要编辑的视图,就可以随意的修改了。如上图所示

2、添加事件处理程序:

右键选择你要添加事件处理程序的菜单,比如“你好”,然后选择添加事件处理程序,这时候选择你需要处理这些事件的类以及消息类型


①代表的是普通的当点击菜单项时候的命令。②是当你单击菜单项之前的处理程序,比如你在点击上面的“字体:宋”(将“你好”改为这个好理解)菜单项之前会调用②类型消息处理程序来确定是现在的状态下字体是否是宋,如果是我就提前标记好这个选项已经选中,当你打开时候已经标记为选中了。然后如果你再单击“你好”,这时候就要调用①的处理程序了。。。


②有5种操作用户界面项的成员函数: