DECLARE_MESSAGE_MAP()与消息传递网

DECLARE_MESSAGE_MAP()与消息传递网

ID:37916403

大小:39.00 KB

页数:3页

时间:2019-06-02

DECLARE_MESSAGE_MAP()与消息传递网_第1页
DECLARE_MESSAGE_MAP()与消息传递网_第2页
DECLARE_MESSAGE_MAP()与消息传递网_第3页
资源描述:

《DECLARE_MESSAGE_MAP()与消息传递网》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、DECLARE_MESSAGE_MAP()与消息传递网一.总体结构首先,在.h文件中:DECLARE_MESSAGE_MAP()然后在.CPP文件中:BEGIN_MESSAGE_MAP(CView,CWnd)ON_COMMAND(CViewid,0)END_MESSAGE_MAP()上面.h中的宏的声明是:#define DECLARE_MESSAGE_MAPstatic AFX_MSGMAP_ENTRY _messageEntries[];static AFX_MSGMAP messageMap;virtual AFX_MSGMAP*GetMessageMap(

2、)const;该宏相当于在类中声明两个static数据成员和一个虚成员函数。 它们的定义由.CPP中的三个宏实现:#define BEGIN_MESSAGE_MAP(class_name,base_class)AFX_MSGMAP*class_name::GetMessageMap()const    {return &class_name::message;}AFX_MSGMAP messageMap=    {&base_class::messageMap,class_name::_messageEntries}AFX_MSGMAP_ENTRY _mess

3、ageEntries[]=    {#define ON_COMMAND(id,memFunc)          {WM_COMMAND,0,id,id,AFx_sig_vv,(AFX_PMSG)memFunc },#define END_MESSAGE_MAP()   {0,0,0,0,AfxSig_end,(AFX_PMSG)0}};注意这三个宏中的内容共同完成了一个AFX_MSGMAP_ENTRY结构体数组的填写,其花括号上面用红色斜体标了出来。因此这三个宏必须连在一起调用,且前后顺序必须正确。总体来说,就是DECLARE_MESSAGE_MAP负责俩个

4、成员变量与一个成员函数的声明,BEGIN_MESSAGE_MAP、ON_COMMAND、END_MESSAGE_MAP、负责声明所对应的实现。二.关于声明至于其中声明的成员变量,如下:1. AFX_MSGMAP。该结构体负责存储两个指针,分别指向基类的 AFX_MSGMAP,以及本类的消息映射表AFX_MSGMAP_ENTRYstruct AFX_MSGMAP{AFX_MSGMAP *pBaseMessageMap;//指向基类的本结构。AFX_MSGMAP_ENTRY*lpEntries;//本类的消息映射表。};2.消息映射表AFX_MSGMAP_ENTRY。该结构

5、体可以存储一条消息的所有相关信息。在类中,使用了该结构体类型的数组,因此本类有多少消息,就需要在数组中存多少元素。struct AFX_MSGMAP_ENTRY{UINT nMessage;UINT nCode;UINT nID;UINT nLastID;UINT nSig;AFX_PMSG pfn;};该结构体最后的成员AFX_PMSG也是个结构体,其声明如下:3.函数指针typedef void (CCmdTarget::*AFX_PMSG)(void); 很明显,AFX_PMSG指向的函数指针是相应消息的处理函数。当触发某个消息时,就会调用该消息所对应的函数指针。

6、以上声明,展开就是:ClassCView:publicCWnd{Public:……static AFX_MSGMAP_ENTRY _messageEntries[];static AFX_MSGMAP messageMap;virtual AFX_MSGMAP*GetMessageMap()const;};三.关于实现.CPP中的三个宏,负责对.h声明的两个成员变量与一个成员函数进行实现。展开后:AFX_MSGMAP*class_name::GetMessageMap()const  {return &class_name::message;}AFX_MSGMAP 

7、messageMap={&base_class::messageMap,class_name::_messageEntries}AFX_MSGMAP_ENTRY _messageEntries[]={{WM_COMMAND,0,id,id,AFx_sig_vv,(AFX_PMSG)memFunc },{0,0,0,0,AfxSig_end,(AFX_PMSG)0}};可见,本类中主要的数据成员只有一个,就是消息映射表AFX_MSGMAP_ENTRY数组。AFX_MSGMAP的两个成员变量,一个指向基类的AFX_MSGMAP_ENTRY,一

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。