乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       9loong 2011-05-08
       

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

      FMD(http://www.)

      一基本架構(gòu)

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

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

      ①文檔類型管理

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

      CDocManager * m_pDocManager

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

      CDocManager內(nèi)部用

      CPtrList m_templateList;(指針鏈表)

      記錄文檔類型

      ②文檔類型實現(xiàn)

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

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

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

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

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

      這些信息被記錄在其三個成員中

      CRuntimeClass* m_pDocClass; // class for creating new documents

      CRuntimeClass* m_pFrameClass; // class for creating new frames

      CRuntimeClass* m_pViewClass; // class for creating new views

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

      CPtrList m_docList;

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

      二 文檔類型的建立

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

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

      三 文檔的新建

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

      CWinApp::OnFileNew()處理

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

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

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

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

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

      CDocument* pDocument = CreateNewDocument();

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

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

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

      CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);

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

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

      CCreateContext context;

      context.m_pNewViewClass = m_pViewClass;

      然后框架對象建立其實際的窗口

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

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

      框架窗口建立客戶區(qū)時,將調(diào)用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()中將自己添加到對應(yīng)文檔的視圖列表中:

      pContext->m_pCurrentDoc->AddView(this);

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

      i. pDocument->OnNewDocument()

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

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

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

      ii. InitialUpdateFrame初始化框架

      InitialUpdateFrame中將激活一個CView對象(若無,則為其他子窗口)

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

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

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

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

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

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

      四 文檔的打開

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

      CWinApp::OnFileOpen()

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

      ②DoPromptFileName提供打開文件對話框,得到文件名

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

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

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

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

      ④回到CDocManager

      m_pDocManager->OpenDocumentFile(lpszFileName);

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

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

      pTemplate->MatchDocType(szPath, pOpenDocument)

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

      若沒打開,單有相符合模板,使用該文檔模板打開文件

      pBestTemplate->OpenDocumentFile(szPath);

      若不是程序處理的文件類型,報錯返回。

      ⑤用找到的最合適文檔模板打開文件。

      CMultiDocTemplate::OpenDocumentFile

      ⑥ ....

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

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

      而不是CDocumet::OnNewDocument();

       
       
      (#)

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多