VS2010/MFC编程入门之四(MFC消息映射机制概述)

上一讲鸡啄米为大家简单分析了MFC应用程序框架,这一讲是关于MFC消息映射机制的内容。

       前面已经说过,Windows应用程序是消息驱动的。在MFC软件开发中,界面操作或者线程之间通信都会经常用到消息,通过对消息的处理实现相应的操作。比较典型的过程是,用户操作窗口,然后有消息产生,送给窗口的消息处理函数处理,对用户的操作做出响应。

       什么是消息

       窗口消息一般由三个部分组成:1.一个无符号整数,是消息值;(2)消息附带的WPARAM类型的参数;(3)消息附带的LPARAM类型的参数。其实我们一般所说的消息是狭义上的消息值,也就是一个无符号整数,经常被定义为宏。

       什么是消息映射机制

       MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。SDK编程时需要在窗口过程中一一判断消息值进行相应的处理,相比之下MFC的消息映射机制要方便好用的多。

       Windows消息分类

       先讲下Windows消息的分类。Windows消息分为系统消息和用户自定义消息。Windows系统消息有三种:

       1.标准Windows消息。除WM_COMMAND外以WM_开头的消息是标准消息。例如,WM_CREATEWM_CLOSE

       2.命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪个菜单、工具栏按钮或加速键的消息。

       3.通知消息。通知消息一般由列表框等子窗口发送给父窗口,消息名也是WM_COMMAND,其中附带了控件通知码来区分控件。

       CWnd的派生类都可以接收到标准Windows消息、通知消息和命令消息。命令消息还可以由文档类等接收。

       用户自定义消息是实际上就是用户定义一个作为消息,此宏的值应该大于等于WM_USER,然后此宏就可以跟系统消息一样使用,窗口类中可以定义它的处理函数。

       消息映射表

       除了一些没有基类的类或CObject的直接派生类外,其他的类都可以自动生成消息映射表。下面的讲解都以前面例程HelloWorldCMainFrame为例。消息映射表如下:

C++代码

1.  BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)  

2.      ON_WM_CREATE()  

3.      ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)  

4.      ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame::OnToolbarCreateNew)  

5.      ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)  

6.      ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)  

7.      ON_WM_SETTINGCHANGE()  

8.  END_MESSAGE_MAP()  

       BEGIN_MESSAG_MAPEND_MESSAGE_MAP之间的内容成为消息映射入口项。消息映射除了在CMainFrame的实现文件中添加消息映射表外,在类的定义文件MainFrm.h中还会添加一个宏调用:

       DECLARE_MESSAGE_MAP()

       一般这个宏调用写在类定义的结尾处。

       添加消息处理函数

       如何添加消息处理函数呢?不管是自动还是手动添加都有三个步骤:

       1.在类定义中加入消息处理函数的函数声明,注意要以afx_msg打头。例如MainFrm.hWM_CREATE的消息处理函数的函数声明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

       2.在类的消息映射表中添加该消息的消息映射入口项。例如WM_CREATE的消息映射入口项:ON_WM_CREATE()

       3.在类实现中添加消息处理函数的函数实现。例如,MainFrm.cppWM_CREATE的消息处理函数的实现:

          intCMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
         {
                 ......
         }

       通过以上三个步骤以后,WM_CREATE等消息就可以在窗口类中被消息处理函数处理了。

       各种Windows消息的消息处理函数

       标准Windows消息的消息处理函数都与WM_CREATE消息类似。

       命令消息的消息映射入口项形式如:ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize),消息为ID_VIEW_CUSTOMIZE,消息处理函数为OnViewCustomize

       如果想要使用某个处理函数批量处理某些命令消息,则可以像CMainFrame消息映射表中的ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000,ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)一样添加消息映射入口项,这样值在ID_VIEW_APPLOOK_WIN_2000ID_VIEW_APPLOOK_WINDOWS_7之间的菜单项等的命令消息都由CMainFrameOnApplicationLook函数处理。函数原型为afx_msg void OnApplicationLook(UINT id);,参数id为用户操作的菜单项等的ID

       在操作列表框等控件时往往会给父窗口发送WM_NOTIFY通知消息。WM_NOTIFY消息的wParam参数为发送通知消息的控件的IDlParam参数指向一个结构体,可能是NMHDR结构体,也可能是第一个元素为NMHDR结构体变量的其他结构体。NMHDR结构体的定义如下(仅作了解):

       Typedef sturcttagNMHDR{
               HWND hwndFrom;
               UINT idFrom;
               UINT code;
       } NMHDR;

       hwndFrom为发送通知消息控件的句柄,idFrom为控件IDcode为要处理的通知消息的通知码,例如NM_CLICK

       
通知消息的消息映射入口项形式如:

       ON_NOTIFY(wNotifyCode,id,memberFxn)

       wNotifyCode为要处理的通知消息通知码,例如:NM_CLICKid为控件标识IDMemberFxn为此消息的处理函数。

       通知消息的处理函数的原型为:

       afx_msg voidmemberFxn( NMHDR * pNotifyStruct, LRESULT * result);

       如果需要使用用户自定义消息,首先要定义消息宏,如:#define WM_UPDATE_WND (WM_USER+1),再到消息映射表中添加消息映射入口项:ON_MESSAGE(WM_UPDATE_WND,&CMainFrame::OnUpdateWnd),然后在MainFrm.h中添加消息处理函数的函数声明:afx_msg LRESULT OnUpdateWnd(WPARAM wParam, LPARAM lParam);,最后在MainFrm.cpp中实现此函数。

       鸡啄米本节对 MFC 消息映射机制只是做了比较简单的讲解,让大家对它有一定的认识, 编程入门 者不必强求完全掌握。在以后的教程中会经常涉及到消息的使用,大家会逐渐熟悉 MFC 的消息映射机制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VS2012是Microsoft Visual Studio 2012的缩写,是一款集成开发环境(IDE)软件,用于开发各种应用程序,包括MFC(Microsoft Foundation Class)编程。 MFC是Windows操作系统上的一个C++类库,提供了一系列类和函数,用于开发Windows桌面应用程序。通过使用MFC,开发人员可以更快、更简单地创建并管理Windows应用程序的用户界面、输入输出、文件操作等。 在VS2012中,通过使用MFC进行编程,可以利用MFC提供的各种类和函数,快速构建Windows应用程序。MFC包含了丰富的UI控件,如按钮、文本框、列表框等,开发者可以直接使用这些控件,而无需自己编写复杂的UI代码。 此外,VS2012还提供了图形化设计工具,如资源编辑器和对话框设计器,使得MFC应用程序的设计和布局更加方便。开发者可以通过拖放控件、设置属性等方式,快速创建所需的用户界面。 对于开发者而言,可以通过学习MFC编程,掌握使用MFC类库的技巧,了解如何响应用户交互、处理消息、操作文件等。MFC编程还包含一些高级概念,如多线程编程、数据库访问等,可以进一步提升应用程序的功能和性能。 在实际编程过程中,可以使用VS2012生成PDF文件的功能来输出报表、文档等。通过使用MFC类库中提供的相关类和函数,可以在应用程序中生成和编辑PDF文件。可以根据需要,设置PDF的格式、内容、样式等,以满足不同的需求。 总之,通过VS2012和MFC编程,开发者可以快速、高效地开发Windows应用程序,并且可以利用MFC类库的强大功能,实现各种复杂的操作和任务,包括生成和编辑PDF文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值