资源描述:
《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,一