以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 C/C++编程思想 』  (http://bbs.xml.org.cn/list.asp?boardid=61)
----  VC++中常用的消息映射机制(MFC)  (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=87804)


--  作者:葛靖青001
--  发布时间:11/19/2010 10:44:00 AM

--  VC++中常用的消息映射机制(MFC)
一、预备工作:

  1、定义消息描绘结构:

  struct AFX_MSGMAP

  {

  AFX_MSGMAP* pBaseMessageMap;

  AFX_MSGMAP_ENTRY* lpEntries;

  };

  2、定义消息表项实体结构:

  struct AFX_MSGMAP_ENTRY // MFC 4.0

  {

  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 nSig;     // signature type (action) or pointer to message #

  AFX_PMSG pfn; // routine to call (or special value)

  };

  二、类内声明:

  #define DECLARE_MESSAGE_MAP()
  static AFX_MSGMAP_ENTRY _messageEntries[];
  static AFX_MSGMAP messageMap;
  virtual AFX_MSGMAP* GetMessageMap() const;

  做了三件事情:

  1、声明了该类的消息表数组:_messageEntries[]

  2、声明了两个指针:pBaseMessageMap;lpEntries;顾名思义,它们分别指向基类的消息表和该类的消息表。

  3、声明了一个函数GetMessageMap() ,顾名思义,它的作用是获得一个指向该类消息表的指针。

  三、在.CPP文件中给表项添加具体条目,并实现GetMessageMap()

  1、声明函数GetMessageMap()

  #define BEGIN_MESSAGE_MAP(theClass, baseClass)
  // [1、实现函数GetMessageMap()] :

  AFX_MSGMAP* theClass::GetMessageMap() const
  { return &theClass::messageMap; }
  //2、实现messageMap:

  AFX_MSGMAP theClass::messageMap =
  { &(baseClass::messageMap),
  (AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) };
  //3、给::_messageEntries[]添加具体表项:

  AFX_MSGMAP_ENTRY theClass::_messageEntries[] =
  {

  诸如COMMAND、PAINT、……

  //4、结束消息描绘表:

  #define END_MESSAGE_MAP()
  { 0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 }
  };

  注意:上面这两个#define是前后呼应的,前一个以“{”为结尾;后一个以“};”为结尾,合而为一才算完整。


W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
31.250ms