文檔視圖結構中文檔操作流程
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