按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
172
…………………………………………………………Page 235……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
于是,DECLARE_MESSAGE_MAP 就相当于声明了这样一个数据结构:
pBaseMessageMap
_messageEntries''
lpEntries
nMessage; nCode; nID; nLastID; nSig; pfn
messageMap
这个数据结构的内容填塞工作由三个宏完成:
#define BEGIN_MESSAGE_MAP (theClass; baseClass)
AFX_MSGMAP* theClass::GetMessageMap() const
{ return &theClass::messageMap; }
AFX_MSGMAP theClass::messageMap =
{ &(baseClass::messageMap);
(AFX_MSGMAP_ENTRY*) &(theClass::_messageEntries) };
AFX_MSGMAP_ENTRY theClass::_messageEntries'' =
{
#define ON_MAND (id; memberFxn)
{ WM_MAND; 0; (WORD)id; (WORD)id; AfxSig_vv; (AFX_PMSG)memberFxn };
#define END_MESSAGE_MAP ()
{ 0; 0; 0; 0; AfxSig_end; (AFX_PMSG)0 }
};
其中的AfxSig_end 定义为:
enum AfxSig
{
AfxSig_end = 0; // 'marks end of message map'
AfxSig_vv;
};
AfxSig_xx 用来描述消息处理例程memberFxn 的类型(参数与回返值)。本例纯为仿真
与简化,所以不在这上面作文章。真正讲到MFC 时(第四篇p580 ),我会再解释它。
173
…………………………………………………………Page 236……………………………………………………………
第篇 勿在浮砂築高台
于是,以CView 为例,下面的源代码:
// in header file
class CView : public CWnd
{
public:
。。。
DECLARE_MESSAGE_MAP()
};
// in implementation file
#define CViewid 122
。。。
BEGIN_MESSAGE_MAP(CView; CWnd)
ON_MAND(CViewid; 0)
END_MESSAGE_MAP()
就被展开成为:
// in header file
class CView : public CWnd
{
public:
。。。
static AFX_MSGMAP_ENTRY _messageEntries'';
static AFX_MSGMAP messageMap;
virtual AFX_MSGMAP* GetMessageMap() const;
};
// in implementation file
AFX_MSGMAP* CView::GetMessageMap() const
{ return &CView::messageMap; }
AFX_MSGMAP CView::messageMap =
{ &(CWnd::messageMap);
(AFX_MSGMAP_ENTRY*) &(CView::_messageEntries) };
AFX_MSGMAP_ENTRY CView::_messageEntries'' =
{
{ WM_MAND; 0; (WORD)122; (WORD)122; 1; (AFX_PMSG)0 };
{ 0; 0; 0; 0; 0; (AFX_PMSG)0 }
};
以图表示则为:
174
…………………………………………………………Page 237……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
CWnd::messageMap
pBaseMessageMap
CView::_messageEntries''
lpEntries
WM_MAND; 0; 122; 122; 1; (AFX_PMSG)0
0; 0; 0; 0; 0; (AFX_PMSG)0 CView::messageMap
我们还可以定义各种类似ON_MAND 这样的宏,把各式各样的消息与特定的处
理例程关联起来。MFC 里头就有名为ON_ WM_PAINT 、ON_ WM_CREATE、ON_ WM_SIZE。。。
等等的宏。
我在Frame7 范例程序中为CCmdTarget 的每一衍生类别都产生类似上图的消息映射表:
// in header files
class CObject
{
。。。 // 注意:CObject 并不属于消息流动网的一份子。
};
class CCmdTarget : public CObject
{
。。。
DECLARE_MESSAGE_MAP()
};
class CWinThread : public CCmdTarget
{
。。。 // 注意:CWinThread 并不属于消息流动网的一份子。
};
class CWinApp : public CWinThread
{
。。。
DECLARE_MESSAGE_MAP()
};
class CDocument : public CCmdTarget
{
。。。
DECLARE_MESSAGE_MAP()
};
class CWnd : public CCmdTarget
{
。。。
DECLARE_MESSAGE_MAP()
175
…………………………………………………………Page 238……………………………………………………………
第篇 勿在浮砂築高台
};
class CFrameWnd : public CWnd
{
。。。
DECLARE_MESSAGE_MAP()
};
class CView : public CWnd
{
。。。
DECLARE_MESSAGE_MAP()
};
class CMyWinApp : public CWinApp
{
。。。
DECLARE_MESSAGE_MAP()
};
class CMyFrameWnd : public CFrameWnd
{
。。。
DECLARE_MESSAGE_MAP()
};
class CMyDoc : public CDocument
{
。。。
DECLARE_MESSAGE_MAP()
};
class CMyView : public CView
{
。。。
DECLARE_MESSAGE_MAP()
};
并且把各消息映射表的关联性架设起来,给予初值(每一个映射表都只有ON_MAND
一个项目):
// in implementation files
BEGIN_MESSAGE_MAP(CWnd; CCmdTarget)
ON_MAND(CWndid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CFrameWnd; CWnd)
ON_MAND(CFrameWndid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CDocument; CCmdTarget)
176
…………………………………………………………Page 239……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
ON_MAND(CDocumentid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CView; CWnd)
ON_MAND(CViewid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CWinApp; CCmdTarget)
ON_MAND(CWinAppid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMyWinApp; CWinApp)
ON_MAND(CMyWinAppid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMyFrameWnd; CFrameWnd)
ON_MAND(CMyFrameWndid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMyDoc; CDocument)
ON_MAND(CMyDocid; 0)
END_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMyView; CView)
ON_MAND(CMyViewid; 0)
END_MESSAGE_MAP()
同时也设定了消息的终极镖靶CCmdTarget 的映射表内容:
AFX_MSGMAP CCmdTarget::messageMap =
{
NULL;
&CCmdTarget::_messageEntries'0'
};
AFX_MSGMAP_ENTRY CCmdTarget::_messageEntries'' =
{
{ 0; 0; CCmdTargetid; 0; AfxSig_end; 0 }
};
于是,整个消息流动网就隐然成形了(图3…5 )。
177
…………………………………………………………Page 240……………………………………………………………
第篇 勿在浮砂築高台
CWinThread CWinApp CMyWinApp