轉自:http://www.jizhuomi.com/software/221.htmlhtml
前面幾節講了菜單、工具欄和狀態欄的使用,本節開始將爲你們講解文檔、視圖和框架的知識。編程
文檔、視圖和框架簡介windows
在VS2010/MFC編程入門之三十四(菜單:VS2010菜單資源詳解)建立的單文檔工程Example34中,咱們能夠看到MFC嚮導自動爲咱們生成了CExample34Doc類、CExample34View類和CMainFrame類,它們就分別是文檔類、視圖類和框架窗口類。app
文檔/視圖結構是MFC提供的一種不錯的設計,它將數據的處理和顯示分開來,這樣更便於咱們對程序的維護和擴展。下面分別介紹這種結構中涉及到的幾個重要概念。框架
文檔函數
文檔對象用於管理和維護數據,包括保存數據、取出數據以及修改數據等操做,在數據被修改之後,文檔能夠通知其對應的全部視圖更新顯示。工具
視圖spa
視圖對象將文檔中的數據可視化,負責從文檔對象中取出數據顯示給用戶,並接受用戶的輸入和編輯,將數據的改變反映給文檔對象。視圖充當了文檔和用戶之間媒介的角色。設計
框架指針
一個文檔可能有多個視圖界面,這就須要有框架來管理了。框架就是用來管理文檔和視圖的。框架窗口是應用程序的主窗口,應用程序執行時會先建立一個最頂層的框架窗口。視圖窗口是沒有菜單和邊界的子窗口,它必須包含在框架窗口中,即置於框架窗口的客戶區內。
文檔模板
文檔模板中存放了與文檔、視圖和框架相關的信息。應用程序經過文檔模板建立文檔對象、框架窗口對象和視圖對象。另外,文檔、視圖和框架之間的關係也是由文檔模板來管理的。
咱們來看看Example34單文檔程序中,CExample34App應用程序類的成員函數CExample34App::InitInstance()建立並註冊文檔模板的部分:
BOOL CExample34App::InitInstance() { ......略 // Register the application's document templates. Document templates // serve as the connection between documents, frame windows and views CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CExample34Doc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CExample34View)); if (!pDocTemplate) return FALSE; AddDocTemplate(pDocTemplate); ......略 return TRUE; }
在構造文檔模板類CSingleDocTemplate的對象時,第一個參數是資源ID IDR_MAINFRAME,它包括框架窗口圖標等,後面的三個參數都是RUNTIME_CLASS宏的調用,RUNTIME_CLASS用於獲取類的運行時信息,文檔模板能夠根據這些動態建立信息來建立相應類的對象,即文檔對象、框架窗口對象和視圖對象。AddDocTemplate函數用來註冊文檔模板對象。
框架類、文檔類和視圖類
在VS2010自動生成的代碼中,框架類繼承於CFrameWndEx類,文檔類繼承於CDocument類,視圖類繼承於CView類。
CFrameWndEx類又繼承於CFrameWnd類,CFrameWnd類中用於管理文檔和視圖的成員函數包括:
virtual CDocument* GetActiveDocument( );
得到當前活動視圖對應文檔對象的指針,若是不存在則返回NULL。
CView* GetActiveView( ) const;
得到當前活動視圖對象的指針,若是不存在則返回NULL。
void SetActiveView(CView* pViewNew, BOOL bNotify = TRUE);
設置活動視圖。參數pViewNew爲要激活的視圖對象的指針,參數bNotify指定視圖是否接收激活通知。
CDocument類的主要成員函數:
virtual BOOL OnNewDocument( );
建立新文檔。能夠重載使用。
virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);
打開文檔。參數lpszPathName爲要打開的文檔的路徑。能夠重載使用。
virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);
保存文檔。參數lpszPathName指定文檔保存到的全路徑。能夠重載使用。
CDocTemplate* GetDocTemplate( ) const;
獲取此文檔類型對應的文檔模板對象的指針。若是此文檔沒有被文檔模板管理則返回NULL。
virtual POSITION GetFirstViewPosition( ) const;
獲取文檔中視圖列表的第一個視圖的位置。
virtual CView* GetNextView(POSITION& rPosition) const;
利用此函數能夠迭代處理文檔的全部視圖。參數rPosition爲上一次調用GetFirstViewPosition或GetNextView成員函數返回的POSITION值的引用。
void AddView(CView* pView);
爲文檔增長一個視圖。參數pView爲要增長的視圖對象的指針。
void RemoveView(CView* pView);
移除某個視圖與文檔的關聯。參數pView爲要移除的視圖對象的指針。
void UpdateAllViews(CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL);
在文檔被更改後調用此函數更新視圖。參數pSender指向修改文檔的視圖,實際應用時經常使用來指定哪一個視圖不須要更新,若是更新全部視圖則設爲NULL,參數lHint包含了文檔修改的信息,參數pHint指向存儲文檔修改信息的對象。
CView類中與文檔/視圖結構相關的成員函數包括:
CDocument* GetDocument( ) const;
獲取視圖關聯的文檔對象的指針。若是視圖沒有關聯到文檔上則返回NULL。