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

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

1、什么是消息?
   窗口消息通常由三个部分组成:一、一个无符号整数,是消息值;二、消息附带的WPARAM类型的参数;三、消
息附带的LPARAM类型的参数。其实,咱们通常所说的消息是侠义上的消息值,也就是一个无符号整数,常常被定义为宏。框架

2、什么是消息映射机制?
   MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射
表,以及消息处理函数的声明和实现等代码。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,
而后由消息处理函数进行相应的处理。函数

3、Windows消息分类
   Windows消息分为系统消息和用户自定义消息。Windows系统消息有三种:
   一、标准Windows消息。除WM_COMMAND之外WM_开头的消息是标准消息。例如,WM_CREATE、WM_CLOSE。
   二、命令消息。消息名为WM_COMMAND,消息中附带了标识符ID来区分是来自哪一个菜单、工具栏按钮或加速键的消息。
   三、通知消息。通知消息通常由列表框等子窗口发送给父窗口,消息名称也是WM_COMMAND,其中附带了控件通知码
来区分控件。
   CWnd的派生类均可以接收到标准Windows消息、通知消息和命令消息。命令消息还能够由文档类等接收。
 用户自定义消息实际上就是用户定义一个宏做为消息,此宏的值应该大于等于WM_USER,而后此宏就能够跟系统消息
同样使用,窗口类中能够定义它的处理函数。工具

4、消息映射表
   除了一些没有基类的类或CObject的直接派生类外,其余的类均可以自动生成消息映射表。下面的讲解都以CMainFrame
为例。消息映射表以下:
C++代码:
 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
    ON_WM_CREATE()
    ON_COMMAND(ID_VIEW_CUSTOMIZE, &CMainFrame::OnViewCustomize)
  
    ON_REGISTERED_MESSAGE(AFX_WM_CREATETOOLBAR, &CMainFrame:OnToolbarCreateNew)
    ON_COMMAND_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnApplicationLook)
    ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_APPLOOK_WIN_2000, ID_VIEW_APPLOOK_WINDOWS_7, &CMainFrame::OnUpdateApplicationLook)
    ON_WM_SETTINGCHANGE()
 END_MESSAGE_MAP()
   在BEGIN_MESSAGE_MAG和END_MESSAGE_MAP之间的内容成为消息映射入口项。消息映射除了在CMainFrame的实线文件中
添加消息映射表外,在类的定义文件MainFrame.h中还会添加一个宏调用:
   DECLARE_MESSAGE_MAP()
通常这个宏调用写在类定义的结尾处。spa

5、添加消息处理函数
   不论是自动添加仍是手动添加都有三个步骤:
   一、在类定义中加入消息处理函数的函数声明,注意要以afx_msg打头。例如MainFrame.h中WM_CREATE的消息处理函数
声明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
   二、在类的消息映射表中添加该消息的消息映射入口项。例如WM_CREATE的消息映射入口项:ON_WM_CREATE()。
   三、在类的实现中添加消息处理函数的函数实现。例如,MainFrm.cpp中WM_CREATE的消息处理函数的实现:
   int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
   {
      ......
   }
   经过以上三个步骤之后,WM_CREATE等消息就能够在窗口类中被消息处理函数处理了。线程

6、各类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_WINDWOS_7, &CMainFrame::OnApplicationLook)同样添加消息映射入口项,这样值在ID_VIEW_APPLOOK_WIN_2000到ID_VIEW_
APPLOOK_WINDOWS_7之间的菜单项等的命令消息都由CMainFrame的OnApplicationLook函数处理。函数原型为afx_msg void OnApplicationLook
(UINT id);参数id为用户操做的菜单项等的ID。
   在操做列表框等控件时每每会给父窗口发送WM_NOTIFY通知消息。WM_NOTIFY消息的wParam参数为发送通知消息的控件的ID,lParam参数指向
一个结构体,多是NMHDR结构体,也多是第一个元素为NMHDR结构体变量的其余结构体。NMHDR结构体的定义以下(仅做了解):
   Typedef struct tagNMHDR
   {
      HWND hwndFrom;
      UINT idFrom;
      UINT code;
   } NMHDR;
 hwndFrom为发送通知消息控件的句柄,idFrom为控件ID,code为要处理的通知消息的通知码,例如NM_CLICk。
 通知消息的消息映射入口项形式如:
   ON_NOTIFY(wNotifyCode, id, memberFxn)
 wNotifyCode为要处理的消息通知码,例如:NM_CLICK。id为控件标识ID。memberFxn为此消息的处理函数。
 通知消息的处理函数的原型为:
   afx_msg void memberFxn(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的消息映射机制。code

相关文章
相关标签/搜索