MFC文档/视图结构体系及SDI回顾(2)
1.牢騷發在最前面
三件事情雜糅到了一起弄得我徹夜未眠。
香港大學的Offer不小心丟在了垃圾郵箱里,卻陰差陽錯的來了清華。平臺是一方面,當時談好的港府獎學金也就此泡湯,這筆錢是我急需的。
驚聞噩耗,蘇暢老師逝世,年僅33歲,不知道是生命奉獻了科研還是科研磨滅掉了生命。
張禮,讀懂你,很難!
2.文檔視圖體系結構中的命令傳送
文檔/視圖體系結構中最引人注目的特性是應用程序幾乎可以在任何地方處理命令的消息?!?strong>命令消息”其實是MFC中的術語,質的就是WM_COMMAND消息,當選擇了菜單項、鍵盤加速鍵被按下或工具欄被單擊時產生此消息。框架窗口實際上是大多數命令消息的接收者,但命令消息可以在視圖類、文檔類、甚至應用程序中被處理,只要在該類的消息的接受中對想要處理的消息添加輸入即可。命令傳送使得我們可以將命令處理程序放在最合適的地方,避免把他們堆砌在框架窗口類中。對于菜單項、工具欄按鈕以及其他用戶界面對象的更新命令也遵循命令傳送機制,因此也可以把ON_UPDATE_COMMAN_Ui處理程序放在非框架窗口中。
命令傳送機制根植在MFC深層內部。當框架窗口接收到WM_COMMAND消息時,會調用所有CCmdTarget派生類特有的虛擬OnComMsg函數來開始傳送過程。
CFrameWnd中OnCmdMsg的實現如下:
BOOL <span style="font-size:18px;">CFrameWnd</span>::OnCmdMsg(...) {CView* pView = GetActiveView();if (pView != NULL && pView->OnCmdMsg(...))return TRUE;if (CWnd::OnCmdMsg(...))return TRUE;CWinApp* pApp = AfxGetApp();if (pApp != NULL && pApp->OnCmdMsg())return TRUE;return FALSE; }CFrameWnd::OnCmdMsg(...)首先調用視圖的pView->OnCmdMsg(...)函數,將消息傳送給活動視圖。如果pView->OnCmdMsg(...)返回值為0,說明視圖沒有處理消息(也就是說視圖消息映射表中沒有包含這個特殊消息的輸入項),框架窗口就會親自調用CWnd::OnCmdMsg(...)來處理消息。如果這樣也不行,框架窗口就會讓應用程序對象去處理。最終如果沒有對象可以處理這個消息,CFrameWnd::OnCmdMsg(...)就會返回FALSE,主結構將消息傳送給::DefWindowProc進行默認處理。
這就是我們多次強調的框架窗口獲得的命令消息被傳送給活動視圖和應用程序對象。
但是,我們不僅會去問,這和文檔對象有什么關系呢?這就涉及到了所有提交給SDI框架窗口的命令消息所經歷的路徑,具體如下圖所示:
活動視圖首先處理消息,接著是與視圖關聯的文檔、文檔模板、框架窗口,最后是應用程序對象。3.預定義的命令ID和命令處理程序
在編寫文檔/視圖應用程序時,通常不用為所有的菜單命令親自編寫處理程序。MFC提供了很多的默認處理程序,此外主結構還提供了多種菜單項命令ID,其中許多已經預先添加到使用它們的來的消息映射表中了。
下表列出了最常用的預定義命令ID和他們相關的命令處理程序:
4.開始實戰吧!
通過回顧性的復習視圖/文檔結構,已經完全具備開發相關的應用程序了,加油!
總結
以上是生活随笔為你收集整理的MFC文档/视图结构体系及SDI回顾(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我们究竟该看待百度更新?
- 下一篇: 根据url提取网站域名的方法小结