深入浅出MFC第2版(PDF格式)-第44部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
};
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
; ; 111; ; ; ; ; 1111; ; ;
0;0;0;0;0;0 0;0;0;0;0;0
CView CMyView
m
e
CCmdTarget CWnd CFrameWnd CMyFrameWnd
s
; ; 122; ; ; ; ; 1221; ; ;
0;0;0;0;0;0 0;0;0;0;0;0 s
a
; ; 12; ; ; ; ; 121; ; ; ; ; 1211; ; ;
; ; 1; ; ; g
0;0;0;0;0;0 0;0;0;0;0;0 0;0;0;0;0;0
0;0;0;0;0;0 e
CDocument CMyDocument
; ; 13; ; ; ; ; 131; ; ;
0;0;0;0;0;0 0;0;0;0;0;0
图3…5 Frame7 程序所架构起来的消息流动网 (也就是Message Map)。
为了验证整个消息映射表,我必须在映射表中做点记号,等全部构造完成之后,再一一
追踪把记号显示出来。我将为每一个类别的消息映射表加上这个项目:
ON_MAND(Classid; 0)
这样就可以把Classid 嵌到映射表中当作记号。正式用途(于MFC 中)当然不是这样,
这只不过是权宜之计。
在main 函数中,我先产生四个对象(分别是CMyWinApp、CMyFrameWnd、CMyDoc、
CMyView 对象):
CMyWinApp theApp; // theApp 是CMyWinApp 对象
void main()
{
CWinApp* pApp = AfxGetApp();
pApp…》InitApplication();
pApp…》InitInstance(); // 产生CMyFrameWnd 对象
pApp…》Run();
178
…………………………………………………………Page 241……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
CMyDoc* pMyDoc = new CMyDoc; // 产生CMyDoc 对象
CMyView* pMyView = new CMyView; // 产生CMyView 对象
CFrameWnd* pMyFrame = (CFrameWnd*)pApp…》m_pMainWnd;
。。。
}
然后分别取其消息映射表,一路追踪上去,把每一个消息映射表中的类别记号打印出来:
void main()
{
。。。
AFX_MSGMAP* pMessageMap = pMyView…》GetMessageMap();
cout