友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
深入浅出MFC第2版(PDF格式)-第44部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
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 CDocument
CDocument CDocument
CMyDoc CMyDoc
CMyDoc CMyDoc
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 CDocument
CDocument CDocument
CMyDoc CMyDoc
CMyDoc CMyDoc
图3…8 当CMyFrameWnd 对象获得一个WM_MAND,所引起的消息流动路线。
200
…………………………………………………………Page 263……………………………………………………………
第3章 MFC 六大關鍵技術之模擬
Frame8 测试四种情况:分别从frame 对象和view 对象中推动消息,消息分一般
Windows 消息和WM_MAND 两种:
// test Message Routing
AfxWndProc(0; WM_CREATE; 0; 0; pMyFrame);
AfxWndProc(0; WM_PAINT; 0; 0; pMyView);
AfxWndProc(0; WM_MAND; 0; 0; pMyView);
AfxWndProc(0; WM_MAND; 0; 0; pMyFrame);
Frame8 的命令列编译联结动作是(环境变量必须先设定好,请参考第4章的「安装与设
定」一节):
cl my。cpp mfc。cpp
以下是Frame8 的执行结果:
CWinApp::InitApplication
CMyWinApp::InitInstance
CFrameWnd::Create
CWnd::CreateEx
CFrameWnd::PreCreateWindow
CWinApp::Run
CWinThread::Run
pMyFrame received a WM_CREATE; routing path and call stack:
AfxWndProc()
AfxCallWndProc()
CWnd::WindowProc()
1211 CMyFrameWnd
121 CFrameWnd
12 CWnd
1 CCmdTarget
pMyView received a WM_PAINT; routing path and call stack:
AfxWndProc()
AfxCallWndProc()
CWnd::WindowProc()
1221 CMyView
122 CView
12 CWnd
1 CCmdTarget
pMyView received a WM_MAND; routing path and call stack:
AfxWndProc()
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!