MFC中文件檢視框架和文件模板之間的關係

farcall發表於2011-04-26

 文件物件:是用來儲存資料的。
 檢視物件:是用來顯示和編輯資料的。

 應用程式框架:框架是用來管理不同文件顯示介面的。例如你有一個資料網格顯示介面,還有一個圖形顯示介面,它們的資料可能都來自你的文件,但是檢視不同,怎麼辦用框架。為什麼不用檢視?為的是把介面管理獨立的拿出來。

文件模板:MFC把文件/檢視/框架視為一體,只要你建立文件/檢視框架結構的程式,必定會為你建立這三個類。這個工作在在應用程式初始化時完成,如下:

  •  

     

       1: BOOL CMyHtmlApp::InitInstance()
       2: {
       3:      //。。。。。。
       4:      CSingleDocTemplate* pDocTemplate;
       5:      pDocTemplate = new CSingleDocTemplate(
       6:          IDR_MAINFRAME,
       7:          RUNTIME_CLASS(CMyHtmlDoc),
       8:          RUNTIME_CLASS(CMainFrame),       // main SDI frame window
       9:          RUNTIME_CLASS(CMyHtmlView));
      10:      AddDocTemplate(pDocTemplate);
      11:      //。。。。。。
      12: }

     

     


    單文件:就是一次只能開啟一個檔案,和你的文件型別支援的多少無關。你完全可以做一個單文件的支援所有圖象格式的程式,只不過它一次只能開啟一個文件罷了。
    多文件:就是你可以開啟多個檔案,和文件型別也無關。你也可以作一個可以同時開啟多個文件的程式,但它只支援一種文件型別。


    何時需要文件/檢視框架結構?

     

    首先你可以不使用文件檢視這種框架結構,即便是在MFC中。你可以在你需要的時候選擇使用這種方式。你可以完成一個只有檢視沒有文件的程式,例如一個基於對話方塊的應用。

     

     

     

     

    哪什麼時候需要呢?
    當你想將你的資料層和介面層分開的時候。
        通常我們對資料的操作放在文件類中,例如存取,開啟,關閉。在這裡你可以盡情的對你的資料進行操作,如果你需要,在對資料進行了改變後,對檢視做一下更新, 那麼程式會將你對資料所做的改變呈現給你的程式的使用者。由此可見檢視的作用就是提供一個使用者和資料之間進行資料交換的介面,它的作用就是在需要的時候顯示 資料,並在需要的時候提供輸入介面。當使用者輸入後實際的資料操作工作是由文件類來做的。

      

    那框架類有在做什麼呢?
    框架類是為了便於管理你的文件類和 檢視類而存在的。通常我們的操作都是通過檢視視窗完成,訊息由檢視進行接收並且進行處理。所以訊息對映定義一般在檢視中。但如果一個應用同時擁有多個視而 當前活動視沒有對訊息進行處理則訊息會發往框架視窗。另外框架視窗可以方便的處理非視窗訊息。
    再來說一邊典型的單文件程式的生成過程(不完整,只挑有用的)
  •  
  • 1     CwinApp物件被建立,這個物件是全域性的且只能有一個,名字叫theApp。這時你可以完成一些工作,例如對登錄檔的操作,(如果你想寫一個不修改登錄檔的軟體,需要在這裡做寫工作)
    2
         InitInstance()函式中建立文件模板,文件模板以CruntimClass靜態成員指標做構造引數。
    3
         執行MFC框架預設的命令列引數。命令列引數有很多其中之一是,Cmd1它會建立一個新檔案。(如果沒有命令列引數則執行預設的ID_FILE_NEW
    4
         文件模板的例項根據三個類的動態建立資訊建立出文件、檢視、框架。
    5
         對文件、檢視、框架進行初始化。
  •  
    •  
    •  

      文件,檢視,框架之間的相互作用。
          由上面的典型的單文件程式的生成過程可以看出一個完整的應用一般由四個類組成:

       

      • CWinApp應用類,
      • CFrameWnd框架類,
      • CDocument文件類,
      • CView檢視類。

      我將四個類常用的成員函式列出,大家一看便知。不過引數,

      返回值均未列出,大家可以從MSDN上了解更多。幾個重要的虛擬函式也未做 說明。大家自己看吧。
      通過全域性函式AfxGetApp可以得到CWinApp應用類的全域性物件theApp.
      CwinApp

       

       

       

         1: 資料成員:
         2: m_pszAppName 應用程式名稱
         3: m_pszExeName 可執行檔案的名稱
         4: m_pszProfileName INI檔案的名
         5: m_pszRegistryKey 登錄檔或INI檔案的KEY
         6: m_hInstance 例項的控制程式碼
         7: m_pMainWnd 為框架視窗指標
         8: 成員函式:
         9: InitInstance()   //初始化
        10: ParseCommandLine() //完成命令列的解析處理
        11: CFrameWnd
        12: GetActiveDocument()     //得到當前活動文件指標
        13: GetActiveView()     //得到當前活動視指標
        14: SetActiveView()     //設定當前檢視為活動檢視
        15: CDocument
        16: OnNewDocument()
        17: OnOpenDocument()
        18: OnSaveDocument()
        19: OnFileClose()
        20: //以上是用來對文件的操作
        21: GetFirstViewPosition() //文件物件連結串列中的第一個文件位置
        22: GetNextView()         //下一個
        23: //以上是用來遍歷所有和文件關聯的檢視
        24: GetDocTemplate()得到文件模板指標
        25: AddView()         //增加一個檢視
        26: RemoveView()     //刪除一個檢視
        27: UpdateAllView()     //更新所有檢視
        28: Cview
        29: GetDocument()得到對應的文件指標

       

       

      其他的就不列出了,大家還是看MSDN。你可以直接檢視CWinApp應用類,CFrameWnd框架類,CDocument文件類,CView檢視類的類成員。
      最後說說幾個常見到的問題。

    • 1、為什麼在對話方塊的應用程式中沒有發現文件模板?
      預設的對話方塊程式沒有使用文件/檢視框架結構。

    •  2、如果我使用資料庫作為資料來源是否意味著可以不需要文件類?
      看你自己,但是我建議使用。因為可以文件,檢視這一個清晰方便的框架結構,以及方便完成三者之間的相互作用。

      http://www.cnblogs.com/tianjinquan/archive/2011/01/18/1938568.html

相關文章