C++ MFC 文檔、視圖和框架窗口間的關係和消息傳送

原文鏈接:http://c.biancheng.net/cpp/html/3084.html

在上一節中對文檔、視圖和框架窗口做了簡單地介紹,總結一下:文檔相當於數據容器,視相當於查看數據的窗口或是和數據發生交互的窗口。(這一結構在MFC中的OLE,ODBC開發時又得到更多的拓展)因此一個完整的應用一般由四個類組成:CWinApp應用類,CFrameWnd窗口框架類,CDocument文檔類,CView視類。

在程序運行時CWinApp將創建一個CFrameWnd框架窗口實例,而框架窗口將創建文檔模板,然後有文檔模板創建文檔實例和視實例,並將兩者關聯。一般來講我們只需對文檔和視進行操作,框架的各種行爲已經被MFC封裝好了,不需人爲干預,這也是Microsoft設計文檔-視結構的主旨,使界面和邏輯分離,讓開發人員將主要的精力放在程序的算法和功能實現上。

在應用中一個視對應一個文檔,但一個文檔可以包含多個視。一個應用中只用一個框架窗口,對多文檔界面來講可能有多個MDI子窗口。每一個視都是一個子窗口,在單文檔界面中父窗口即是框架窗口,在多文檔界面中父窗口爲MDI子窗口。一個多文檔應用中可以包含多個文檔模板,一個模板定義了一個文檔和一個或多個視之間的對應關係。同一個文檔可以屬於多個模板,但一個模板中只允許定義一個文檔。同樣一個視也可以屬於多個文檔模板。

接下來看看如何在程序中得到各種對象的指針:

  • 全局函數AfxGetApp可以得到CWinApp應用類指針。
  • AfxGetApp()->m_pMainWnd爲框架窗口指針。
  • 在框架窗口中:CFrameWnd::GetActiveDocument得到當前活動文檔指針。
  • 在框架窗口中:CFrameWnd::GetActiveView得到當前活動視指針。
  • 在視中:CView::GetDocument得到對應的文檔指針。
  • 在文檔中:CDocument::GetFirstViewPosition,CDocument::GetNextView用來遍歷所有和文檔關聯的視。
  • 在文檔中:CDocument::GetDocTemplate得到文檔模板指針。
  • 在多文檔界面中:CMDIFrameWnd::MDIGetActive得到當前活動的MDI子窗口。


一般來講用戶輸入消息(如菜單選擇,鼠標,鍵盤等)會首先發送視,如果視未處理則會發往框架窗口。所以定義消息映射時定義在視中就可以了,如果一個應用同時擁有多個視而當前活動視沒有對消息進行處理則消息會發往框架窗口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章