小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

MFC淺析(2) 文檔視圖結(jié)構(gòu)中文檔操作流程

 9loong 2011-05-08
 

文檔視圖結(jié)構(gòu)中文檔操作流程

FMD(http://www.)

一基本架構(gòu)

一個(gè)程序可以看作是建立在對(duì)文檔進(jìn)行處理的基礎(chǔ)上的,而程序可處理的文檔類(lèi)型有可能有多種,同時(shí)每種文檔又可能同時(shí)被打開(kāi)多個(gè)。每個(gè)文檔又可分為數(shù)據(jù)部分和表現(xiàn)部分。

基于這種認(rèn)識(shí),MFC文檔視圖框架結(jié)構(gòu)將各功能模塊總結(jié)為對(duì)象,用相互關(guān)聯(lián)的這些對(duì)象類(lèi)來(lái)建立應(yīng)用程序.

①文檔類(lèi)型管理

CWinApp代表程序,它可處理多種類(lèi)型的文檔,這樣,就必須有一個(gè)存儲(chǔ)管理文檔類(lèi)型的內(nèi)部成員,這個(gè)成員就是

CDocManager * m_pDocManager

CDocManager負(fù)責(zé)管理文檔類(lèi)型

CDocManager內(nèi)部用

CPtrList m_templateList;(指針鏈表)

記錄文檔類(lèi)型

②文檔類(lèi)型實(shí)現(xiàn)

CDocTemplate(文檔模板)代表具體的文檔類(lèi)型

一個(gè)程序所能處理的文檔類(lèi)型,對(duì)對(duì)應(yīng)各自的文檔模板

這些模板對(duì)象的指針被記錄在m_templateList,并且由m_pDocManager管理

③文檔模板的實(shí)現(xiàn)

對(duì)于某一種文檔,其內(nèi)部數(shù)據(jù)結(jié)構(gòu),及外部表現(xiàn)形式,及針對(duì)它的操作命令都相對(duì)固定,因此文檔模板有三個(gè)構(gòu)成部分,文檔的數(shù)據(jù),用CDoucument管理;文檔的表現(xiàn)形式,CView表示;文檔在窗口系統(tǒng)中的容器,及菜單,工具條等命令形式則由CFrameWnd管理。必要時(shí),同一文檔可能需要多種表達(dá),即一個(gè)CDocument可能關(guān)聯(lián)幾個(gè)CView,但模板聲明時(shí),只考慮一個(gè)文檔對(duì)應(yīng)一個(gè)視圖。

這些信息被記錄在其三個(gè)成員中

CRuntimeClass* m_pDocClass; // class for creating new documents

CRuntimeClass* m_pFrameClass; // class for creating new frames

CRuntimeClass* m_pViewClass; // class for creating new views

一各文檔模板,對(duì)應(yīng)一種文件類(lèi)型,而這一類(lèi)型的文件則可以有很多,這些對(duì)應(yīng)的文件將記錄在

CPtrList m_docList;

另外,文檔模板也包含了該文檔類(lèi)型所對(duì)應(yīng)的資源,如菜單,標(biāo)題,圖標(biāo)等等信息

二 文檔類(lèi)型的建立

程序執(zhí)行之初,(InitInstance 中)將建立文檔類(lèi)型鏈表

依次建立多個(gè)文檔類(lèi)型(CCMultiDocTemplate),再一一添加(AddDocTemplate)到CWinApp的文檔類(lèi)型列表m_templateList中這樣就建立了一個(gè)文件類(lèi)型表,文件的新建,打開(kāi)都將首先查找這個(gè)文件類(lèi)型鏈表,找出文檔的類(lèi)型,得到文檔模板,由文檔模板得到文檔應(yīng)有的數(shù)據(jù)結(jié)構(gòu)、文檔的圖形表述,及操作等等。

三 文檔的新建

①界面 命令I(lǐng)D_FILE_NEW發(fā)出

CWinApp::OnFileNew()處理

交由CDocManager * m_pDocManager(文檔類(lèi)型管理)處理

②CDocuManager查看文件類(lèi)型列表,如過(guò)程序支持多種類(lèi)型文檔,給出一個(gè)類(lèi)型選擇機(jī)會(huì)。

若文檔類(lèi)型列表中只有一種文檔類(lèi)型,直接選用這種類(lèi)型。

③找到文檔模板后,將調(diào)用文檔模板的OpenDocumentFile(..)成員,傳入的參數(shù)為NULL,表示新建

i . OpenDocumentFile首先將首先建立文檔的數(shù)據(jù)部分:

CDocument* pDocument = CreateNewDocument();

這將按照m_pDocClass所記錄的CDocument類(lèi)建立其實(shí)際數(shù)據(jù)對(duì)象。

數(shù)據(jù)對(duì)象建立后,將其添加到CPtrList m_docList中,記錄下這一文檔模板對(duì)應(yīng)打開(kāi)的所有實(shí)際文件。 同時(shí),CDocument也有一個(gè)列表CPtrList m_viewList; 用于記錄文檔對(duì)象所對(duì)應(yīng)的(CView)視圖,視圖 容許有多個(gè)(同樣的數(shù)據(jù),可能有需要不同的表達(dá)形式)。

ii. 為數(shù)據(jù)建立其表現(xiàn)形式的容器,即框架窗口

CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);

根據(jù)文檔模板記錄的框架類(lèi)m_pFrameClass建立框架對(duì)象。

iii. 建立框架對(duì)象的同時(shí),CView(數(shù)據(jù)的表現(xiàn)形式,數(shù)據(jù)圖像)的類(lèi)型m_pViewClass將作為參數(shù)傳給框架對(duì)象

CCreateContext context;

context.m_pNewViewClass = m_pViewClass;

然后框架對(duì)象建立其實(shí)際的窗口

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

LoadFrame 中將調(diào)用Create生成窗口,

框架窗口建立客戶(hù)區(qū)時(shí),將調(diào)用CreateView(pContext, AFX_IDW_PANE_FIRST)建立模板所制定的CView對(duì)象

并建立窗體pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,CRect(0,0,0,0), this, nID, pContext))

在CView建立時(shí),其OnCreate()中將自己添加到對(duì)應(yīng)文檔的視圖列表中:

pContext->m_pCurrentDoc->AddView(this);

④文檔對(duì)象(一般將文檔(文件)的數(shù)據(jù)部分成為文檔對(duì)象,與前面提到的文檔意義有區(qū)別),文檔對(duì)象的表現(xiàn)部分(視圖對(duì)象) 及視圖對(duì)象在Windows系統(tǒng)中的窗口容器(框架對(duì)象)自此都建立好了,接下來(lái),是各對(duì)象的初始化。

i. pDocument->OnNewDocument()

在OnNewDocument()中有用戶(hù)實(shí)現(xiàn)相應(yīng)數(shù)據(jù)的新建或初始。

完成后,將m_nUntitledCount增1,這個(gè)數(shù)用來(lái)對(duì)新文檔進(jìn)行計(jì)數(shù),好用來(lái)給新文件起缺省名(例如:未命名3.txt);

(如果OpenDocumentFile(.)有參數(shù)(打開(kāi)文件時(shí)),在這兒將調(diào)用的是pDocument->OnOpenDocument() 用文件中的數(shù)據(jù)初始數(shù)據(jù)對(duì)象,)

ii. InitialUpdateFrame初始化框架

InitialUpdateFrame中將激活一個(gè)CView對(duì)象(若無(wú),則為其他子窗口)

并且向所有子窗口發(fā)送SendMessageToDescendants(WM_INITIALUPDATE, 0, 0, TRUE, TRUE);

WM_INITIALUPDATE是MFC自定義的消息,用于在此時(shí)實(shí)現(xiàn)相關(guān)初始化,

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

激活框架窗口或相應(yīng)視圖。

其后,更新框架窗口標(biāo)題

⑤自此,新建文檔過(guò)程結(jié)束。

四 文檔的打開(kāi)

①響應(yīng)打開(kāi)命令 ID_FILE_OPEN

CWinApp::OnFileOpen()

調(diào)用m_pDocManager->OnFileOpen();

②DoPromptFileName提供打開(kāi)文件對(duì)話(huà)框,得到文件名

③調(diào)用AfxGetApp()->OpenDocumentFile(newName);

(這與新建文件有所不同)

這是應(yīng)用程序類(lèi)的一個(gè)虛函數(shù),可以添加特定處理于此

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

④回到CDocManager

m_pDocManager->OpenDocumentFile(lpszFileName);

查找文檔模板列表,找出文檔應(yīng)該采用的文檔模板。

調(diào)用各模板的MatchDocType 判斷是否合適,或是否已經(jīng)打開(kāi)過(guò)了。

pTemplate->MatchDocType(szPath, pOpenDocument)

若文件已經(jīng)被某模板打開(kāi)過(guò),激活相應(yīng)框架,試圖。

若沒(méi)打開(kāi),單有相符合模板,使用該文檔模板打開(kāi)文件

pBestTemplate->OpenDocumentFile(szPath);

若不是程序處理的文件類(lèi)型,報(bào)錯(cuò)返回。

⑤用找到的最合適文檔模板打開(kāi)文件。

CMultiDocTemplate::OpenDocumentFile

⑥ ....

以下各步驟與新建文件③以后各步相同,只是傳入?yún)?shù)不同

建立文檔對(duì)象后,初始化時(shí),將調(diào)用CDocumet::OpenDocumentFile

而不是CDocumet::OnNewDocument();

 
 
(#)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多