轉自:http://www.jizhuomi.com/software/223.htmlhtml
前面一節進行了文檔、視圖和框架的概述,本節主要講解文檔、視圖、框架結構中各對象之間的關係。編程
各個對象之間的關係框架
文檔、視圖、框架結構中涉及到的對象主要有:應用程序對象、文檔模板對象、文檔對象、視圖對象和框架窗口對象等。根據上一節的概述,你們對它們的概念已經有所瞭解了,下面就對它們之間的關係進行總結和歸納,並對各個關係中用到的類的成員函數進行介紹。函數
1. 應用程序對象保存了一個文檔模板的列表。在任何對象中調用全局函數AfxGetApp均可以得到應用程序對象的指針。經過調用CWinAppEx::GetFirstDocTemplatePosition、CWinAppEx::GetNextDocTemplate函數能夠遍歷全部的文檔模板。spa
2. 文檔模板對象用於維護文檔、視圖和框架窗口的映射關係,它包含有一個已打開文檔的列表。咱們能夠經過調用CDocTemplate::GetFirstDocPosition、CDocTemplate::GetNextDoc來遍歷該文檔模板對應的全部文檔。指針
3. 框架窗口對象中包含有指向當前活動視圖對象的指針。AfxGetApp()->m_pMainWnd即爲主框架窗口對象的指針。咱們能夠經過調用CFrameWndEx::GetActiveView來獲取當前活動視圖對象的指針,而且使用CFrameWndEx::GetActiveDocument函數能夠得到當前活動視圖對應的文檔。htm
4. 文檔對象中維護着該文檔的視圖列表,以及建立該文檔的文檔模板對象的指針。咱們能夠經過調用CDocument::GetFirstViewPosition,CDocument::GetNextView來遍歷該文檔關聯的全部視圖,調用CDocument::GetDocTemplate獲取建立該文檔的文檔模板對象的指針。對象
5. 視圖是框架窗口的子窗口,它保存有指向對應的文檔對象的指針。咱們能夠經過調用CView::GetParentFrame獲取其所屬的框架窗口對象的指針,調用CView::GetDocument獲取該視圖對應的文檔對象的指針。blog
另外,在MDI多文檔程序中,調用CMDIFrameWnd::MDIGetActive能夠獲取當前活動的MDI子窗口。文檔
文檔和視圖的關係
應用程序能夠是單文檔程序也能夠是多文檔程序。單文檔程序中主框架窗口和文檔框架窗口重合,而多文檔程序的主框架窗口中有客戶窗口,客戶窗口中又包含了多個文檔框架窗口。
文檔和視圖是一對多的關係。一個文檔能夠對應多個視圖,例如在Word中一個文檔有普通視圖、大綱視圖、Web版式視圖、閱讀版式視圖等多種視圖。而一個視圖只能屬於一個文檔。最簡單的應用程序是單文檔單視圖程序,除此以外還有單文檔多視圖程序、多文檔程序等。
每一個文檔對象都保存着一個視圖列表,能夠經過CDocument::AddView函數添加視圖,經過CDocument::RemoveView函數刪除視圖,在數據發生變化時調用CDocument::UpdateAllViews函數更新全部視圖。
在MFC中文檔能夠有三種視圖模式:
1. 文檔有多個視圖對象,它們是同一個視圖類的對象,每一個視圖對象位於一個獨立的文檔框架窗口中。
2. 文檔的基於同一個視圖類的多個視圖對象,位於同一個文檔框架窗口中。Word的子窗口就是這種視圖模式。
3.文檔的視圖對象屬於不一樣的視圖類,但全部的視圖對象位於同一文檔框架窗口中。
雞啄米在網上找到了一張分別對應三種視圖模式的圖以下: