MFC中的消息映射表

 关于MFC中的消息映射表
  用于封装消息的结构AFX_MSGMAP_ENTRY
  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)
  };
  其中typedef void (AFX_MSG_CALL CCmdTarget::*AFX_PMSG)(void);
  构成消息映射标的结构AFX_MSGMAP
  struct AFX_MSGMAP
  {
  const AFX_MSGMAP* pBaseMap;
  const AFX_MSGMAP_ENTRY* lpEntries;
  };
  这样一个AFX_MSGMAP对象就成了构建消息映射表的关键人物,它一只手拉着基类的AFX_MSGMAP对象,另一只手拉着类本身的消息映射表,这样只要正确地在每一个类中都安插一个AFX_MSGMAP对象,那么整个消息映射表就建立起来了。
  那么,何为正确呢?含义有2:一是正确的设置pBaseMap,令它指向基类,二是正确的建立类自身的消息映射表。这两个工作是由4个宏完成的,
  它们是:DECLARE_MEMSSAGE_MAP() / BEGIN_MESSAGE_MAP() / ON_COMMAND()(ON_COMMAND宏只是为了处理命令消息,对于其它的消息还有对应的宏,但是原理是相同的) / MESSAGE_MAP()
  #define DECLARE_MESSAGE_MAP() private: static const AFX_MSGMAP_ENTRY _messageEntries[]; protected: static const AFX_MSGMAP messageMap; virtual const AFX_MSGMAP* GetMessageMap() const; 这个宏的作用有3:
  在类中插入一个静态成员_messageEntries,这是用来存放类要处理的消息的数组(即类本身的消息映射表)
  另一个静态成员massageMap用来指向基类的消息映射表
  安插一个虚函数,其内容有待实现
  接下来,_messageEntries的初始化,messageMap的正确指向,GetMessageMap函数的实现这些工作还都没做,那正是后三个宏的责任,它们要顺序使用,方能工作正常。
  #define BEGIN_MESSAGE_MAP(theClass, baseClass) const AFX_MSGMAP* theClass::GetMessageMap() const { return &theClass::messageMap; } AFX_COMDAT const AFX_MSGMAP theClass::messageMap = { &baseClass::messageMap, &theClass::_messageEntries[0] }; AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = { 这个宏的作用有3:
  定义了安插在类中的虚函数GetMessageMap(),只是简单的返回messageMap对象的地址
  初始化messageMap,把派生类和基类联系起来构成一个大的消息映射表
  为类本身的消息映射表的初始化做语法准备
  ON_COMMAND这个宏的作用就是向_messageEntries数组中添加类本身要处理的命令消息,其实在MFC中还有很多更方便的宏可以向类中添加消息,例如OM_WM_PAINT等,这里,我们主要讨论ON_COMMAND,毕竟原理都是相同的。
  #define ON_COMMAND(id, memberFxn) { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_v, static_cast<AFX_PMSG> (memberFxn) },
  无非是对AFX_MSG_ENTRY结构的初始化,这样在类中为每一个想要处理的消息都是用一个ON_COMMAND宏,就自动的初始化了类本身的消息映射表。
  最后,当全部的信息添加完毕后,使用END_MESSAGE_MAP()宏通知MFC一个类消息映射表结束了。
  #define END_MESSAGE_MAP() {0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } }; 实现手法单纯得很,无非是一个全0的AFX_MESSAGE_MAP对象。(王朝网络 wangchao.net.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值