复习总结《一》MFC消息映射
2017-05-09 19:37
316 查看
长时间人容易遗忘,从新捡起!特做下记录
MFC消息映射
1.在MFC中消息映射主要牵扯到三个宏分别为:
2.先看源码
3.上述源码中牵扯到两个结构体分别为
包含两部分:1.函数指针(指向父类的获取AFX_MSGMAP的指针的静态函数) 2.AFX_MSGMAP_ENTRY结构体的指针
形成结构图
4.无论MFC中消息的走向如何(是向基类直接走还是横向走消息),我们先必须把整个爬行路线网建立起来,即如上图就可以把基类和派生类连接起来。
作为消息基类CCmdTarget需要特殊处理,即CCmdTarget的父类的AFX_MSGMAP为NULL,CCmdTarget内的AFX_MSGMAP_ENTRY仅包含一项, 如下:
CCmdTarget类头文件包含
MFC消息映射
1.在MFC中消息映射主要牵扯到三个宏分别为:
DECLARE_MESSAGE_MAP() BEGIN_MESSAGE_MAP(theClass, baseClass) END_MESSAGE_MAP()
2.先看源码
#define DECLARE_MESSAGE_MAP() \ protected: \ static const AFX_MSGMAP* PASCAL GetThisMessageMap(); \ virtual const AFX_MSGMAP* GetMessageMap() const; \
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \ const AFX_MSGMAP* theClass::GetMessageMap() const \ { return GetThisMessageMap(); } \ const AFX_MSGMAP* PASCAL theClass::GetThisMessageMap() \ { \ typedef theClass ThisClass; \ typedef baseClass TheBaseClass; \ static const AFX_MSGMAP_ENTRY _messageEntries[] = \ {
#define END_MESSAGE_MAP() \ {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \ }; \ static const AFX_MSGMAP messageMap = \ { &TheBaseClass::GetThisMessageMap, &_messageEntries[0] }; \ return &messageMap; \ }
3.上述源码中牵扯到两个结构体分别为
struct AFX_MSGMAP_ENTRY { 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_PTR nSig; // signature type (action) or pointer to message # AFX_PMSG pfn; // routine to call (or special value) };
struct AFX_MSGMAP { const AFX_MSGMAP* (PASCAL* pfnGetBaseMap)(); const AFX_MSGMAP_ENTRY* lpEntries; };
包含两部分:1.函数指针(指向父类的获取AFX_MSGMAP的指针的静态函数) 2.AFX_MSGMAP_ENTRY结构体的指针
形成结构图
4.无论MFC中消息的走向如何(是向基类直接走还是横向走消息),我们先必须把整个爬行路线网建立起来,即如上图就可以把基类和派生类连接起来。
作为消息基类CCmdTarget需要特殊处理,即CCmdTarget的父类的AFX_MSGMAP为NULL,CCmdTarget内的AFX_MSGMAP_ENTRY仅包含一项, 如下:
CCmdTarget类头文件包含
DECLARE_MESSAGE_MAP()CCmdTarget类源文件有
const AFX_MSGMAP* CCmdTarget::GetMessageMap() const { return GetThisMessageMap(); } const AFX_MSGMAP* CCmdTarget::GetThisMessageMap() { static const AFX_MSGMAP_ENTRY _messageEntries[] = { { 0, 0, AfxSig_end, 0 } // nothing here }; static const AFX_MSGMAP messageMap = { NULL, &_messageEntries[0] }; return &messageMap; }
相关文章推荐
- MFC复习(五)MFC消息映射与消息传递
- MFC复习和学习 第二章 MFC消息映射 消息宏实现 消息分类
- 总结二、MFC消息映射
- 深入理解MFC中的消息映射原理!!!
- MFC 颜色对话框 字体对话框 WM_CTLCOLOR消息总结
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- 常用MFC消息映射宏说明
- MFC 颜色对话框 字体对话框 WM_CTLCOLOR消息总结
- MFC消息处理函数是怎么映射的
- 第一篇文章——MFC自定义消息与WSAAsyncSelect模型小总结
- MFC消息映射与命令传递
- MFC---- MFC技术内幕系列之消息映射与消息传递
- MFC消息映射梳理
- MFC之消息映射机制实现方法
- 孙鑫VC视频教程笔记之第四课“MFC消息映射机制和CDC类”
- VC++深入详解(2):MFC消息映射与基本绘图
- 孙鑫VC++讲座笔记-(4)MFC消息映射机制的剖析
- mfc自定义消息机制学习总结
- MFC的消息映射
- MFC消息映射机制的剖析 讲述如何运用ClassWizard