DECLARE_MESSAGE_MAP()与消息传递网.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DECLARE_MESSAGE_MAP()与消息传递网

DECLARE_MESSAGE_MAP()与消息传递网 一.总体结构 首先,在.h文件中: DECLARE_MESSAGE_MAP() 然后在.CPP文件中: BEGIN_MESSAGE_MAP(CView, CWnd) ON_COMMAND(CViewid, 0) END_MESSAGE_MAP() 上面.h中的宏的声明是: #define?DECLARE_MESSAGE_MAP\ static?AFX_MSGMAP_ENTRY?_messageEntries[];\ static?AFX_MSGMAP?messageMap;\ virtual?AFX_MSGMAP*GetMessageMap()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燺messageEntries[]=\ 牋?爗 #define燨N_COMMAND(id,memFunc)\ 牋牋牋牋牋 {WM_COMMAND,0,id,id,AFx_sig_vv,(AFX_PMSG)memFunc爙, #define燛ND_MESSAGE_MAP()\ 牋?{0,0,0,0,AfxSig_end,(AFX_PMSG)0}\ }; 注意这三个宏中的内容共同完成了一个AFX_MSGMAP_ENTRY结构体数组的填写,其花括号上面用红色斜体标了出来。因此这三个宏必须连在一起调用,且前后顺序必须正确。 总体来说,就是DECLARE_MESSAGE_MAP负责俩个成员变量与一个成员函数的声明,BEGIN_MESSAGE_MAP、ON_COMMAND、END_MESSAGE_MAP、负责声明所对应的实现。 二.关于声明 至于其中声明的成员变量,如下: 1. ?AFX_MSGMAP。该结构体负责存储两个指针,分别指向基类的?AFX_MSGMAP,以及本类的消息映射表AFX_MSGMAP_ENTRY struct?AFX_MSGMAP { AFX_MSGMAP?*pBaseMessageMap;//指向基类的本结构。 AFX_MSGMAP_ENTRY*lpEntries;//本类的消息映射表。 }; 2.消息映射表AFX_MSGMAP_ENTRY。该结构体可以存储一条消息的所有相关信息。在类中,使用了该结构体类型的数组,因此本类有多少消息,就需要在数组中存多少元素。 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指向的函数指针是相应消息的处理函数。当触发某个消息时,就会调用该消息所对应的函数指针。 以上声明,展开就是: Class CView:public CWnd { 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?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_PMS

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档