按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
return FALSE;
}
于是得到这个结果:
CDocument::OnCmdMsg()
CCmdTarget::OnCmdMsg()
131 CMyDoc
13 CDocument
1 CCmdTarget
197
…………………………………………………………Page 260……………………………………………………………
第篇 勿在浮砂築高台
如果在映射表中还是没找到对应消息,二万五千里长征还是未能结束,这时候退守回到
CFrameWnd::OnCmdMsg , 调用 CWnd::OnCmdMsg (也就是
CCmdTarget::OnCmdMsg ),得到这个结果:
CCmdTarget::OnCmdMsg()
1211 CMyFrameWnd
121 CFrameWnd
12 CWnd
1 CCmdTarget
如果在映射表中还是没找到对应消息,二万五千里长征还是未能结束,再退回到
CFrameWnd::OnCmdMsg , 调用 CWinApp::OnCmdMsg (亦即
CCmdTarget::OnCmdMsg ),得到这个结果:
1111 CMyWinApp
111 CWinApp
1 CCmdTarget
万一还是没找到对应的消息, 二万五千里长征可也穷途末路了, 退回到
CWnd::WindowProc,调用CWnd::DefWindowProc 。你可以想象,在真正的MFC 中
这个成员函数必是调用Windows API 函数::DefWindowProc 。为了简化,我让它在
Frame8 中是个空函数。
故事结束!
我以图3…7 表示这二万五千里长征的调用次序(call stack ),图3…8 表示这二万五千里
长征的消息流动路线。
198
…………………………………………………………Page 261……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
CObject
AfxWndProc CObject
AfxWndProc
CCmdTarget
CCmdTarget
CWinThread
AfxCallWndProc CWinThread
AfxCallWndProc
CWinApp
CWinApp
CMyWinApp
CMyWinApp
CWnd::WindowProc
CWnd::WindowProc CWnd
CWnd
CView
CView
WM_MAND CFrameWnd::Onmand CMyView
CFrameWnd::Onmand CMyView
CFrameWnd
CFrameWnd
general CWnd::Onmand CMyFrameWnd
CWnd::Onmand CMyFrameWnd
Windows
CDocument
message CDocument
(WM_xxx)
CMyDoc
CFrameWnd::OnCmdMsg CMyDoc
or CView::OnCmdMsg
AFX_MSGMAP* pMessageMap = CWnd::OnCmdMsg ………》 CCmdTarget::OnCmdMsg
AFX_MSGMAP* pMessageMap =
GetMessageMap(); CWinApp::OnCmdMsg ………》 CCmdTarget::OnCmdMsg
GetMessageMap();
for(; pMessageMap != NULL;。。。) CView::OnCmdMsg
for(; pMessageMap != NULL;。。。) CView::OnCmdMsg
{ 。。。 }
{ 。。。 }
or CWnd::OnCmdMsg ………》 CCmdTarget::OnCmdMsg
CDocument::OnCmdMsg
CDocument::OnCmdMsg
CDocument::OnCmdMsg
or
CCmdTarget::OnCmdMsg ………》 CCmdTarget::OnCmdMsg
CCmdTarget::OnCmdMsg(。。。)
CCmdTarget::OnCmdMsg(。。。)
// walking the message map。
// walking the message map。
AFX_MSGMAP* pMessageMap = GetMessageMap();
AFX_MSGMAP* pMessageMap = GetMessageMap();
for(; pMessageMap != NULL;。。。) { 。。。 }
for(; pMessageMap != NULL;。。。) { 。。。 }
图3…7 当CMyFrameWnd 对象获得一个WM_MAND,所引起的Frame8
函数调用次序。
199
…………………………………………………………Page 262……………………………………………………………
第篇 勿在浮砂築高台
CObject CObject
CObject CObject
CCmdTarget CCmdTarget
CCmdTarget CCmdTarget
CWinThread CWinThread
CWinThread CWinThread
CWinApp CWinApp
CWinApp CWinApp
CMyWinApp CMyWinApp
CMyWinApp CMyWinApp
CWnd CWnd
CWnd CWnd
CView CView
CView CView
CMyView CMyView
CMyView CMyView
CFrameWnd CFrameWnd
CFrameWnd CFrameWnd
CMyFrameWnd CMyFrameWnd
CMyFrameWnd CMyFrameWnd
CDocument