MFC淺析(2) 文檔視圖結構中文檔操作流程

來源:互聯網
上載者:User

文檔視圖結構中文檔操作流程

FMD(http://www.fmdstudio.net)

一基本架構

一個程式可以看作是建立在對文檔進行處理的基礎上的, 而程式可處理的文件類型有可能有多種,同時每種文檔 又可能同時被開啟多個。每個文檔又可分為資料部分和 表現部分。

基於這種認識,MFC文檔視圖架構結構將各 功能模組總結為對象,用相互關聯的這些對象類來建立 應用程式.

①文件類型管理

CWinApp代表程式,它可處理多種類型的文檔,這樣,就 必須有一個儲存管理文件類型的內部成員,這個成員就是

CDocManager * m_pDocManager

CDocManager負責管理文件類型

CDocManager內部用

CPtrList m_templateList;(指標鏈表)

記錄文件類型

②文件類型實現

CDocTemplate(文件範本)代表具體的文件類型

一個程式所能處理的文件類型,對對應各自的文件範本

這些模板對象的指標被記錄在m_templateList,並且由m_pDocManager管理

③文件範本的實現

對於某一種文檔,其內部資料結構,及外部表格現形式,及針對它的操作命令都相對固定,因此 文件範本有三個構成部分,文檔的資料,用CDoucument管理;文檔的表現形式,CView表示;文檔 在視窗系統中的容器,及菜單,工具條等命令形式則由CFrameWnd管理。必要時,同一文檔可能需 要多種表達,即一個CDocument可能關聯幾個CView,但模板聲明時,只考慮一個文檔對應一個視圖。

這些資訊被記錄在其三個成員中

CRuntimeClass* m_pDocClass; // class for creating new documents

CRuntimeClass* m_pFrameClass; // class for creating new frames

CRuntimeClass* m_pViewClass; // class for creating new views

一各文件範本,對應一種檔案類型,而這一類型的檔案則可以有很多,這些對應的檔案將記錄在

CPtrList m_docList;

另外,文件範本也包含了該文件類型所對應的資源,如菜單,標題,表徵圖等等資訊

二 文件類型的建立

程式執行之初,(InitInstance 中)將建立文件類型鏈表

依次建立多個文件類型(CCMultiDocTemplate),再一一添加(AddDocTemplate)到CWinApp的文件類型列表m_templateList中 這樣就建立了一個檔案類型表,檔案的建立,開啟都將首先尋找這個檔案類型鏈表,找出文檔的類型,得到文件範本, 由文件範本得到文檔應有的資料結構、文檔的圖形表述,及操作等等。

三 文檔的建立

①介面 命令ID_FILE_NEW發出

CWinApp::OnFileNew()處理

交由CDocManager * m_pDocManager(文件類型管理)處理

②CDocuManager查看檔案類型列表,如過程式支援多種類型文檔,給出一個類型選擇機會。

若文件類型列表中只有一種文件類型,直接選用這種類型。

③找到文件範本後,將調用文件範本的OpenDocumentFile(..)成員,傳入的參數為NULL,表示建立

i . OpenDocumentFile首先將首先建立文檔的資料部分:

CDocument* pDocument = CreateNewDocument();

這將按照m_pDocClass所記錄的CDocument類建立其實際資料對象。

資料對象建立後,將其添加到CPtrList m_docList中,記錄下這一文件範本對應開啟的所有實際檔案。 同時,CDocument也有一個列表CPtrList m_viewList; 用於記錄文檔對象所對應的(CView)視圖,視圖 容許有多個(同樣的資料,可能有需要不同的表達形式)。

ii. 為資料建立其表現形式的容器,即架構視窗

CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);

根據文件範本記錄的架構類m_pFrameClass建立架構對象。

iii. 建立架構對象的同時,CView(資料的表現形式,資料映像)的類型m_pViewClass將作為參數傳給架構對象

CCreateContext context;

context.m_pNewViewClass = m_pViewClass;

然後架構對象建立其實際的視窗

 if (!pFrame->LoadFrame(m_nIDResource,   WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,   // default frame styles   NULL, &context))

LoadFrame 中將調用Create產生視窗,

架構視窗建立客戶區時,將調用CreateView(pContext, AFX_IDW_PANE_FIRST)建立模板所制定的CView對象

並建立表單pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0), this, nID, pContext))

在CView建立時,其OnCreate()中將自己添加到對應文檔的視圖列表中:

pContext->m_pCurrentDoc->AddView(this);

④文檔對象(一般將文檔(檔案)的資料部分成為文檔對象,與前面提到的文檔意義有區別),文檔對象的表現部分(視圖對象) 及視圖對象在Windows系統中的視窗容器(架構對象)自此都建立好了,接下來,是各對象的初始化。

i. pDocument->OnNewDocument()

在OnNewDocument()中有使用者實現相應資料的建立或初始。

完成後,將m_nUntitledCount增1,這個數用來對新文檔進行計數,好用來給新檔案起預設名(例如:未命名3.txt);

(如果OpenDocumentFile(.)有參數(開啟檔案時),在這兒將調用的是pDocument->OnOpenDocument() 用檔案中的資料初始資料對象,)

ii. InitialUpdateFrame初始化架構

InitialUpdateFrame中將啟用一個CView對象(若無,則為其他子視窗)

並且向所有子視窗發送SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);

WM_INITIALUPDATE是MFC自訂的訊息,用於在此時實現相關初始化,

在CView::OnInitialUpdate中可寫入需要添加的初始操作。

啟用架構視窗或相應視圖。

其後,更新架構視窗標題

⑤自此,建立文檔過程結束。

四 文檔的開啟

①響應開啟命令 ID_FILE_OPEN

CWinApp::OnFileOpen()

調用m_pDocManager->OnFileOpen();

②DoPromptFileName提供開啟檔案對話方塊,得到檔案名稱

③調用AfxGetApp()->OpenDocumentFile(newName);

(這與建立檔案有所不同)

這是應用程式類的一個虛函數,可以添加特定處理於此

一般情況下,將接著調用CWinApp::OpenDocumentFile(newName);

④回到CDocManager

m_pDocManager->OpenDocumentFile(lpszFileName);

尋找文件範本列表,找出文檔應該採用的文件範本。

調用各模板的MatchDocType 判斷是否合適,或是否已經開啟過了。

pTemplate->MatchDocType(szPath, pOpenDocument)

若檔案已經被某模板開啟過,啟用相應架構,試圖。

若沒開啟,單有相符合模板,使用該文件範本開啟檔案

pBestTemplate->OpenDocumentFile(szPath);

若不是程式處理的檔案類型,報錯返回。

⑤用找到的最合適文件範本開啟檔案。

CMultiDocTemplate::OpenDocumentFile

⑥ ....

以下各步驟與建立檔案③以後各步相同,只是傳入參數不同

建立文檔對象後,初始化時,將調用CDocumet::OpenDocumentFile

而不是CDocumet::OnNewDocument();

轉帖:http://blog.csdn.net/fmd/article/details/5523

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.