DECLARE_MESSAGE_MAP()与消息传递网.doc_第1页
DECLARE_MESSAGE_MAP()与消息传递网.doc_第2页
DECLARE_MESSAGE_MAP()与消息传递网.doc_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

DECLARE_MESSAGE_MAP()与消息传递网一总体结构首先,在.h文件中:DECLARE_MESSAGE_MAP()然后在.CPP文件中:BEGIN_MESSAGE_MAP(CView, CWnd)ON_COMMAND(CViewid, 0)END_MESSAGE_MAP()上面.h中的宏的声明是:#defineDECLARE_MESSAGE_MAPstaticAFX_MSGMAP_ENTRY_messageEntries;staticAFX_MSGMAPmessageMap;virtualAFX_MSGMAP*GetMessageMap()const;该宏相当于在类中声明两个static数据成员和一个虚成员函数。它们的定义由.CPP中的三个宏实现:#defineBEGIN_MESSAGE_MAP(class_name,base_class)AFX_MSGMAP*class_name:GetMessageMap()constreturn&class_name:message;AFX_MSGMAPmessageMap=&base_class:messageMap,class_name:_messageEntriesAFX_MSGMAP_ENTRY_messageEntries=#defineON_COMMAND(id,memFunc)WM_COMMAND,0,id,id,AFx_sig_vv,(AFX_PMSG)memFunc,#defineEND_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_ENTRYstructAFX_MSGMAPAFX_MSGMAP*pBaseMessageMap;/指向基类的本结构。AFX_MSGMAP_ENTRY*lpEntries;/本类的消息映射表。;2.消息映射表AFX_MSGMAP_ENTRY。该结构体可以存储一条消息的所有相关信息。在类中,使用了该结构体类型的数组,因此本类有多少消息,就需要在数组中存多少元素。structAFX_MSGMAP_ENTRYUINTnMessage;UINTnCode;UINTnID;UINTnLastID;UINTnSig;AFX_PMSGpfn;该结构体最后的成员AFX_PMSG也是个结构体,其声明如下:3.函数指针typedefvoid(CCmdTarget:*AFX_PMSG)(void); 很明显,AFX_PMSG指向的函数指针是相应消息的处理函数。当触发某个消息时,就会调用该消息所对应的函数指针。以上声明,展开就是:Class CView:public CWndPublic:staticAFX_MSGMAP_ENTRY _messageEntries;staticAFX_MSGMAP messageMap;virtualAFX_MSGMAP* GetMessageMap()const;三关于实现.CPP中的三个宏,负责对.h声明的两个成员变量与一个成员函数进行实现。展开后:AFX_MSGMAP*class_name:GetMessageMap()constreturn&class_name:message;AFX_MSGMAPmessageMap=&base_class:messageMap,class_name:_messageEntriesAFX_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,一个指向本类的AFX_MSGMAP_ENTRY。而那个成员函数GetMessageMap()则是用来获取本类的AFX_MSGMAP的。因此,若有派生关系:CCmdeTarget-CWnd-CView-CMyView则:可以通过GetMessageMap()用来获取CMyView的AFX_MSGMAP,从而得到CMyView的AFX_MSGMAP_ENTRY和基类的AFX_MSGMAP (也就是CView的AFX_MSGMAP) 。由于得到了CView的AFX_MSGMAP,于是又有了CView的AFX_MSGMAP_ENTRY和基类的AFX_MSGMAP (也就是CWnd的AFX_MSGMAP) 。同理,可以获取CCmdeTarget的AFX_MSGMAP。但CCmdeTarget就是最终消息的源头类了,不会再上溯。因此CCmdeTarget的AFX_MSGMAP需要单独实现。故而,一条消息,交给一个派生类对象CMyView后,可以不断上溯,直到到达CCmdeTarget。这,就是消息传递网。这张网为消息在基类与派生类之间传递提供了通道。但现在仅仅是架设了一张网,消息进来后,还是不能自行传递或流动,缺乏一个推动消息前进的动力。该动力属于Windows程序设计的工作。特别注意,在这张网中,消息一定是由派生类流向基类的,纵向流动,而不能逆流(基类流向派生类)或者横流(流向兄弟类)。对于一般的Windows消息(WM_xxx),一定遵循此规则。但对于命令消息WM_COMMAND,消息流动则可能有其他路线。夹在BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间的宏,上面是ON_COMMAND。该宏的作用是将消息与消息处理函数绑定。但除了ON_COMMAND之外,还有很多其他的宏也用于这里。比如ON_ WM_CREATE,ON_WM_LBUTTONDOWN,ON_WM_PAINT等。不同之处在于,ON_COMMAND宏可以将很多不同类型的消息与处理函

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论