上一讲鸡啄米为大家简单分解了MFC运用程序框架,这一讲是关于MFC消歇映射机制的实质。

       前面曾经说过,Windows运用程序是消歇驱动的。正正在MFC软件开发中,界面操作或者线程之间通讯都会经常用到消歇,通过对消歇的治理实现相应的操作。比拟规范的历程是,用户操作窗口,然后有消歇发生,送给窗口的消歇治理函数治理,对用户的操作做出照应。

       什么是消歇

        窗口消歇一般由三个限制组成:1.一个无符号整数,是消歇值;(2)消歇附带的WPARAM样板的参数;(3)消歇附带的LPARAM样板的参数。其实银河文娱有哪些网站_云顶文娱场7610_bet9九州 网站一般所说的消歇是狭义上的消歇值,也就是一个无符号整数,经常被定义为宏。

       什么是消歇映射机制

        MFC运用一种消歇映射机制来治理消歇,正正在运用程序框架中的表现就是一个消歇与消歇治理函数逐一对应的消歇映射表,以及消歇治理函数的声明和实现等代码。当窗口接收到消歇时,会到消歇映射表中查找该消歇对应的消歇治理函数,然后由消歇治理函数进行相应的治理。SDK编程时需要正正在窗口历程中逐一坚决消歇值进行相应的治理,比拟之下MFC的消歇映射机制要便当好用的众。

       Windows消歇分类

       先讲下Windows消歇的分类。Windows消歇分为编制消歇和用户自定义消歇。Windows编制消歇有三种:

       1.标准Windows消歇。除WM_COMMAND外以WM_由来的消歇是标准消歇。例如,WM_CREATE、WM_CLOSE。

       2.下令消歇。消歇名为WM_COMMAND,消歇中附带了标识符ID来辨别是来自哪个菜单、东西栏按钮或加速键的消歇。

       3.告诉消歇。告诉消歇一般由列表框等子窗口发送给父窗口,消歇名也是WM_COMMAND,其中附带了控件告诉码来辨别控件。

        CWnd的派生类都可以接收到标准Windows消歇、告诉消歇和下令消歇。下令消歇还可以由文档类等接收。

       用户自定义消歇是执行上就是用户定义一个作为消歇,此宏的值应该大于等于WM_USER,然后此宏就可以跟编制消歇往往运用,窗口类中可以定义它的治理函数。

       消歇映射表

       除了一些没有基类的类或CObject的直接派生类外,其他的类都可以自动天生消歇映射表。下面的解说都夙昔面例程HelloWorld的CMainFrame为例。消歇映射表如下:

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_MAP和END_MESSAGE_MAP之间的实质成为消歇映射入口项。消歇映射除了正正在CMainFrame的实现文件中添加消歇映射表外,正正在类的定义文件MainFrm.h中还会添加一个宏调用:

       DECLARE_MESSAGE_MAP()

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

VS2010/MFC编程初学之五(MFC消歇映射机制概述)

       添加消歇治理函数

       怎样添加消歇治理函数呢?不管是自动还是手动添加都有三个步骤:

        1.正正在类定义中加入消歇治理函数的函数声明,帮理要以afx_msg打头。例如MainFrm.h中WM_CREATE的消歇治理函数的函数声明:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);。

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

       3.正正在类实现中添加消歇治理函数的函数实现。例如,MainFrm.cpp中WM_CREATE的消歇治理函数的实现:

          int CMainFrame::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_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 sturct 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的消歇映射机制。

 

除非特别注明,鸡啄米文章均为原创
转载请标明本文地址:http://www.sygjbus.cn/software/147.html
2012年3月20日
作家:鸡啄米 分类:软件开发 浏览: 评论:13