前面幾節講了菜單工具欄狀態欄的使用,雞啄米本節開始將為大家講解文檔、視圖和框架的知識。

       文檔、視圖和框架簡介

       在VS2010/MFC編程入門之三十四(菜單:VS2010菜單資源詳解)創建的單文檔工程Example34中,我們可以看到MFC向導自動為我們生成了CExample34Doc類、CExample34View類和CMainFrame類,它們就分別是文檔類、視圖類和框架窗口類。

       文檔/視圖結構是MFC提供的一種不錯的設計,它將數據的處理和顯示分開來,這樣更便于我們對程序的維護和擴展。下面分別介紹這種結構中涉及到的幾個重要概念。

       文檔

       文檔對象用于管理和維護數據,包括保存數據、取出數據以及修改數據等操作,在數據被修改以后,文檔可以通知其對應的所有視圖更新顯示。

       視圖

       視圖對象將文檔中的數據可視化,負責從文檔對象中取出數據顯示給用戶,并接受用戶的輸入和編輯,將數據的改變反映給文檔對象。視圖充當了文檔和用戶之間媒介的角色。

       框架

       一個文檔可能有多個視圖界面,這就需要有框架來管理了。框架就是用來管理文檔和視圖的。框架窗口是應用程序的主窗口,應用程序執行時會先創建一個最頂層的框架窗口。視圖窗口是沒有菜單和邊界的子窗口,它必須包含在框架窗口中,即置于框架窗口的客戶區內。

       文檔模板

       文檔模板中存放了與文檔、視圖和框架相關的信息。應用程序通過文檔模板創建文檔對象、框架窗口對象和視圖對象。另外,文檔、視圖和框架之間的關系也是由文檔模板來管理的。

       我們來看看Example34單文檔程序中,CExample34App應用程序類的成員函數CExample34App::InitInstance()創建并注冊文檔模板的部分:

C++代碼
  1. BOOL CExample34App::InitInstance()   
  2. {   
  3.     ......略   
  4.     // Register the application's document templates.  Document templates   
  5.     //  serve as the connection between documents, frame windows and views   
  6.     CSingleDocTemplate* pDocTemplate;   
  7.     pDocTemplate = new CSingleDocTemplate(   
  8.         IDR_MAINFRAME,   
  9.         RUNTIME_CLASS(CExample34Doc),   
  10.         RUNTIME_CLASS(CMainFrame),       // main SDI frame window   
  11.         RUNTIME_CLASS(CExample34View));   
  12.     if (!pDocTemplate)   
  13.         return FALSE;   
  14.     AddDocTemplate(pDocTemplate);   
  15.   
  16.     ......略   
  17.   
  18.     return TRUE;   
  19. }  

       在構造文檔模板類CSingleDocTemplate的對象時,第一個參數是資源ID IDR_MAINFRAME,它包括框架窗口圖標等,后面的三個參數都是RUNTIME_CLASS宏的調用,RUNTIME_CLASS用于獲取類的運行時信息,文檔模板可以根據這些動態創建信息來創建相應類的對象,即文檔對象、框架窗口對象和視圖對象。AddDocTemplate函數用來注冊文檔模板對象。

VS2010/MFC編程入門之三十九(文檔、視圖和框架:概述)

       框架類、文檔類和視圖類

       在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。

       本節就講到這里,歡迎大家關注雞啄米后面的VS2010/MFC入門教程。

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.vkzldl.live/software/221.html
2012年8月15日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:9