標籤:使用 os io 檔案 資料 ar 問題 cti
理解文檔/視圖架構 出處.雷神 瞭解文檔和視圖的相互作用關係是編寫MFC程式的基本功。但是MFC的應用程式架構把文檔和視圖之間的關係封裝了起來,初學的朋友往往不得要領,因此寫程式往往被局限於在用嚮導產生的架構中。本文希望能夠儘可能說明白文檔視圖架構之間是如何進行作用,希望能給一些朋友帶來小小的協助。 幾個概念: (雖然大家都知道了,雷神還是要重申一次) 文檔對象:是用來儲存資料的。 視圖對象:是用來顯示和編輯資料的。 應用程式架構:架構是用來管理不同文檔顯示介面的。例如你有一個資料格顯示介面,還有一個圖形顯示介面,它們的資料可能都來自你的文檔,但是視圖不同,怎麼辦用架構。為什麼不用視圖?為的是把介面管理獨立的拿出來。 文件範本:MFC把文檔/視圖/架構視為一體,只要你建立文檔/視圖架構結構的程式,必定會為你建立這三個類。這個工作在在應用程式初始化時完成,如下: BOOL CMyHtmlApp::InitInstance() { //。。。。。。 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CMyHtmlDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CMyHtmlView)); AddDocTemplate(pDocTemplate); //。。。。。。 } 單文檔:就是一次只能開啟一個檔案,和你的文件類型支援的多少無關。你完全可以做一個單文檔的支援所有圖象格式的程式,只不過它一次只能開啟一個文檔罷了。 多文檔:就是你可以開啟多個檔案,和文件類型也無關。你也可以作一個可以同時開啟多個文檔的程式,但它只支援一種文件類型。 何時需要文檔/視圖架構結構? 首先你可以不使用文檔視圖這種架構結構,即便是在MFC中。你可以在你需要的時候選擇使用這種方式。你可以完成一個只有視圖沒有文檔的程式,例如一個基於對話方塊的應用。 哪什麼時候需要呢? 當你想將你的資料層和介面層分開的時候。 通常我們對資料的操作放在文檔類中,例如存取,開啟,關閉。在這裡你可以盡情的對你的資料進行操作,如果你需要,在對資料進行了改變後,對視圖做一下更新,那麼程式會將你對資料所做的改變呈現給你的程式的使用者。由此可見視圖的作用就是提供一個使用者和資料之間進行資料交換的介面,它的作用就是在需要的時候顯示資料,並在需要的時候提供輸入介面。當使用者輸入後實際的資料操作工作是由文檔類來做的。那架構類有在做什麼呢? 架構類是為了便於管理你的文檔類和視圖類而存在的。通常我們的操作都是通過視圖視窗完成,訊息由視圖進行接收並且進行處理。所以訊息映射定義一般在視圖中。但如果一個應用同時擁有多個視而當前活動視沒有對訊息進行處理則訊息會發往架構視窗。另外架構視窗可以方便的處理非視窗訊息。
再來說一邊典型的單文檔程式的產生過程(不完整,只挑有用的) 1、 CwinApp對象被建立,這個對象是全域的且只能有一個,名字叫theApp。這時你可以完成一些工作,例如對註冊表的操作,(如果你想寫一個不修改註冊表的軟體,需要在這裡做寫工作) 2、 在InitInstance()函數中建立文件範本,文件範本以CruntimClass靜態成員指標做構造參數。 3、 執行MFC架構預設的命令列參數。命令列參數有很多其中之一是,Cmd1它會建立一個新檔案。(如果沒有命令列參數則執行預設的ID_FILE_NEW) 4、 文件範本的執行個體根據三個類的動態建立資訊建立出文檔、視圖、架構。 5、 對文檔、視圖、架構進行初始化。 我們對文檔,視圖,架構如何產生以及他們的用途有了一定的瞭解,如何有效使用它們呢。 文檔,視圖,架構之間的相互作用。 由上面的典型的單文檔程式的產生過程可以看出一個完整的應用一般由四個類組成:CWinApp應用類,CFrameWnd架構類,CDocument文檔類,CView視圖類。我將四個類常用的成員函數列出,大家一看便知。不過參數,傳回值均未列出,大家可以從MSDN上瞭解更多。幾個重要的虛函數也未做說明。大家自己看吧。 通過全域函數AfxGetApp可以得到CWinApp應用類的全域對象theApp. CwinApp 資料成員: m_pszAppName 應用程式名稱 m_pszExeName 可執行檔的名稱 m_pszProfileName INI檔案的名 m_pszRegistryKey 註冊表或INI檔案的KEY m_hInstance 執行個體的控制代碼 m_pMainWnd 為架構視窗指標 成員函數: InitInstance() //初始化 ParseCommandLine() //完成命令列的解析處理 CFrameWnd GetActiveDocument() //得到當前使用中文件指標 GetActiveView() //得到當前活動視指標 SetActiveView() //設定當前視圖為即時檢視 CDocument OnNewDocument() OnOpenDocument() OnSaveDocument() OnFileClose() //以上是用來對文檔的操作 GetFirstViewPosition() //文檔對象鏈表中的第一個文檔位置 GetNextView() //下一個 //以上是用來遍曆所有和文檔關聯的視圖 GetDocTemplate()得到文件範本指標 AddView() //增加一個視圖 RemoveView() //刪除一個視圖 UpdateAllView() //更新所有視圖 Cview GetDocument()得到對應的文檔指標 其他的就不列出了,大家還是看MSDN。你可以直接查看CWinApp應用類,CFrameWnd架構類,CDocument文檔類,CView視圖類的類成員。 最後說說幾個常見到的問題。 1、 為什麼在對話方塊的應用程式中沒有發現文件範本? 預設的對話方塊程式沒有使用文檔/視圖架構結構。 2、 如果我使用資料庫作為資料來源是否意味著可以不需要文檔類? 看你自己,但是我建議使用。因為可以文檔,視圖這一個清晰方便的架構結構,以及方便完成三者之間的相互作用。 |