MFC消息映射机制

摘要:关于MFC消息映射机制的深入研究。

步骤/方法

  • 01

    预备工作: 定义消息描绘结构: struct AFX_MSGMAP { AFX_MSGMAP* pBaseMessageMap; AFX_MSGMAP_ENTRY* lpEntries; }; 定义消息表项实体结构: struct AFX_MSGMAP_ENTRY // MFC 4.0 { UINT nMessage; // windows message UINT nCode; // control code or WM_NOTIFY code UINT nID; // control ID (or 0 for windows messages) UINT nLastID; // used for entries specifying a range of control id's UINT nSig; // signature type (action) or pointer to message # AFX_PMSG pfn; // routine to call (or special value) };

  • 02

    类内声明: #define DECLARE_MESSAGE_MAP() \ static AFX_MSGMAP_ENTRY _messageEntries[]; \ static AFX_MSGMAP messageMap; \ virtual AFX_MSGMAP* GetMessageMap() const; 做了三件事情: 声明了该类的消息表数组:_messageEntries[] 声明了两个指针:pBaseMessageMap;lpEntries;顾名思义,它们分别指向基类的消息表和该类的消息表。 声明了一个函数GetMessageMap() ,顾名思义,它的作用是获得一个指向该类消息表的指针。

  • 03

    在.CPP文件中给表项添加具体条目,并实现GetMessageMap() 声明函数GetMessageMap() #define BEGIN_MESSAGE_MAP(theClass, baseClass) \ // [1、实现函数GetMessageMap()] : AFX_MSGMAP* theClass::GetMessageMap() const \ { return &theClass::messageMap; } \ //实现messageMap: AFX_MSGMAP theClass::messageMap = \ { &(baseClass::messageMap), \ (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) }; \ //给::_messageEntries[]添加具体表项: AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \ { 诸如COMMAND、PAINT、…… //结束消息描绘表: #define END_MESSAGE_MAP() \ { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \ };

  • 04

    注意:上面这两个#define是前后呼应的,前一个以“{”为结尾;后一个以“};”为结尾,合而为一才算完整。

(0)

相关推荐

  • 如果MFC的消息映射表需要排序

    这是今天下班前和同事讨论的问题. MFC的消息映射通过几个简单的宏,对Windows的消息机制做了非常好的面向对象封装,一时为无数C++程序员所模仿(当然,MFC可能也是模仿别人的).熟悉MFC消息映 ...

  • MFC的消息实现机制

    我们可以看到,在MFC的框架结构下,可以进行消息处理的类的头文件里面都会含有DECLARE_MESSAGE_MAP()宏,这里主要进行消息映射和消息处理函数的声明.可以进行消息处理的类的实现文件里一般 ...

  • VS2012怎么利用MFC制作简单的计算器?

    用MFC来制作一个简单的计算器,来加深对MFC学习的理解,这个计算器是建立在对话框的基础上,下面来简单介绍下如何制作属于你自己的计算器. 1.首先,点击VS2012,启动VS软件,然后建立如下图所示的 ...

  • MFC中菜单的简单用法

    当新建一个MFC SDI应用程序以后,会自动的添加一个菜单栏,在菜单栏中,会包含常规的菜单项:文件.编辑.查看.帮助等:理所当然的,我们可以轻松的编辑这些菜单项. 步骤/方法 01 添加菜单项:选择& ...

  • MFC中Silder控件及定时函数SetTimer的用法

    在MFC的对话框中可以插入一些控件,其中Silder就是常用之一.下面记录了Silder控件的常用操作 步骤/方法 01 设置最大值和最小值 通过函数SetRange来完成,例如:m_Slider.S ...

  • 在MFC中将窗口最小化到托盘

    摘要:关于在MFC中将窗口最小化到托盘~~ 步骤/方法 01 (一) 原理 1.最小化的原理:首先要将窗口隐藏,然后在右下角绘制图标. 2.恢复的原理:将窗口显示,再将托盘中的图片删除. 02 (二) ...

  • WebBrowser控件示例程序

    摘要:关于WebBrowser控件示例程序的深入研究. 步骤/方法 01 本示例MyBrowser具体演示以上讨论的技术,它显示一个包含在MyBrowser.exe中的HTML页面,并通过IDocHo ...

  • Windows、Linux、Android、IOS 开发编程经验

    回想起来,从写一行"Hello World"到如今,已经有七八年了,回想起来,真正让自己技术得到提升的关键点有三个方面,一个是"实战项目",一个是"技 ...

  • LINUX系统下vsftpd 命令详解

    FTP命令是Internet用户使用最频繁的命令之一,不论是在DOS还是UNIX操 作系统下使用FTP,都会遇到大量的FTP内部命令。 熟悉并灵活应用FTP的内部 命令,可以大大方便使用者,并收到事半 ...