专栏首页acoolgiser_zhuanlanMFC编程入门之五(MFC消息映射机制概述)

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

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

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

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

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

四、消息映射表    除了一些没有基类的类或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() 一般这个宏调用写在类定义的结尾处。

五、添加消息处理函数    不管是自动添加还是手动添加都有三个步骤:    1、在类定义中加入消息处理函数的函数声明,注意要以afx_msg打头。例如MainFrame.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_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的消息映射机制。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JavaScript中的iterable类型(Map,Set,Array三种)的遍历方法for in;for of;forEach的用法区别

    遍历Array可以采用下标循环,遍历Map和Set就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable类型,Array、Map和Set都属于i...

    acoolgiser
  • C# + ArcEngine读取文件地理数据库fileGDB中的数据集和要素类生成目录树

    首先是得到了工作空间中的要素数据集,即EnumDataSet对象,通过第一个参数传递进来;

    acoolgiser
  • vue 控制某个元素的显示与隐藏之v-if属性

    解释: 默认showPrise和showRentPrise的状态是false,所以是隐藏的。  当你在changeStatus通过了某种条件,你就可以控制s...

    acoolgiser
  • 直播评论系统分析设计

    直播评论系统是电商系统一个常用的功能,即在发布新品的时候,为了吸引用户参与和营造互动气氛,让参与的每个人都可以发消息,发完后每个人都可以即时看到新消息,原型和 ...

    心平气和
  • 低频ID 卡安全分析与克隆攻击

    低频非接触式ID 卡主要应用于门禁、考勤等系统,使用很广泛,但是具有比较大的安全隐患,由于没有密钥安全认证的相关机制,所以只要对低频ID 卡的编码 / 解码机制...

    博文视点Broadview
  • 基于客户行为事件的跨领域统一推荐模型探讨

    跨领域深度学习模型一直是近几年推荐系统主要研究方向之一, 本文探讨一种个人客户画像构建的新思路, 并讨论对应的基于个人行为事件的跨领域统一推荐模型。 1、基于个...

    小莹莹
  • Python 异常处理

    程序员可以方便地注册函数到某一个命令, 用户输入命令时, 路由到注册的函数, 如果此命令没有对应的函数, 执行默认函数 分析 :

    py3study
  • 实时消息传输协议(RTMP)详解

    概述 概念:RTMP协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频、视频和互动内容)。RTMP提供了一套全双工的可靠的...

    xiangzhihong
  • 基于客户行为事件的跨领域统一推荐模型探讨

    跨领域深度学习模型一直是近几年推荐系统主要研究方向之一, 本文探讨一种个人客户画像构建的新思路, 并讨论对应的基于个人行为事件的跨领域统一推荐模型。

    华章科技
  • 优化python执行效率

    开始优化前,写一个高级测试来证明原来代码很慢。你可能需要采用一些最小值数据集来复现它足够慢。通常一两个显示运行时秒的程序就足够处理一些改进的地方了。

    py3study

扫码关注云+社区

领取腾讯云代金券