用MFC,很常用的一个宏是DECLARE_MESSAGE_MAP,在很多代码里面都会有的,一般是系统自动生成放在类的最后面,或者是修饰符的前面。比如下面:

  afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  afx_msg void OnPaint();
  afx_msg HCURSOR OnQueryDragIcon();
  DECLARE_MESSAGE_MAP()public:
  afx_msg void OnLvnItemchangedList1(NMHDR *pNMHDR, LRESULT *pResult);
  afx_msg void OnBnClickedCancel();

  注意它是放在了public的前面!但是如果出现了这样的结构,就会大出问题:

class CTest : public CDialgo
{
  ...
public
  int GetID();
  DECLARE_MESSAGE_MAP()
  int GetOrder();
...
};

那这个GetOrder就不是public的函数了,而是protected的类型了!原因在于:

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

  在最后面,为了不破坏封状性,更改了类的修饰符。这一点,在MSDN里面有提到的,而且是粗体。但是,这种做法总是不太好,不直观。

  当然,Visual C++的编译器对标准的C++支持的比较好,所以不能采用一些通融的做法,不得不用这样的手段来进行封装,也是属于为了标准而付出的代价了。但是以前听人说VCL(Delphi的库)的封装要比MFC高一个层次,看来不假啊!

原文来自我的教育网博客