win5-6MFC視圖結(jié)構(gòu)課件_第1頁(yè)
win5-6MFC視圖結(jié)構(gòu)課件_第2頁(yè)
win5-6MFC視圖結(jié)構(gòu)課件_第3頁(yè)
win5-6MFC視圖結(jié)構(gòu)課件_第4頁(yè)
win5-6MFC視圖結(jié)構(gòu)課件_第5頁(yè)
已閱讀5頁(yè),還剩31頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

MFC文檔視圖結(jié)構(gòu)一、文檔視結(jié)構(gòu)概述思考:一個(gè)排序小程序的編寫過(guò)程,框架?應(yīng)用層、顯示層、存儲(chǔ)層 Observer模式文檔視結(jié)構(gòu)是程序框架中應(yīng)用層(數(shù)據(jù)處理層)與數(shù)據(jù)顯示層之間的一種數(shù)據(jù)交換關(guān)系。其主要思想是設(shè)計(jì)模式中的Observer模式。把數(shù)據(jù)處理和顯示有機(jī)分離,合理交互。在MFC中,則更多代表了一種程序框架模式。一、文檔視結(jié)構(gòu)概述MFC庫(kù)支持:SingleDocumentInterfaceMultiple-DocumentInterface一、文檔視結(jié)構(gòu)概述SDI和MDI主要差別(用戶的角度) SDI的應(yīng)用程序只有一個(gè)窗口,每次只能讀寫一個(gè)文件或文檔。例如:Windows的notepad MDI的應(yīng)用程序每次可以讀寫多個(gè)文件或文檔,可以同時(shí)對(duì)多個(gè)文檔進(jìn)行操作,可以有多個(gè)子窗口。例如:Windows的Word一、文檔視結(jié)構(gòu)概述SDI和MDI主要差別(程序員角度)SDI不需要生成CChildFrame類SDI應(yīng)用程序的CMainFrame類的基類為CFrameWnd

MDI應(yīng)用程序的CMainFrame類的基類為CMDIFrameWndDOCUMENT/VIEW架構(gòu)(1)·MFC引入了"文檔/視圖"結(jié)構(gòu)的概念,理解這個(gè)結(jié)構(gòu)是編寫基于MFC編寫復(fù)雜VisualC++程序的關(guān)鍵。DOCUMENT/VIEW架構(gòu)(2)·在此模型中,MFC文檔對(duì)象將數(shù)據(jù)讀入或?qū)懭胗谰么鎯?chǔ)區(qū)。該文檔還可能提供到數(shù)據(jù)所駐留的任何位置(如在數(shù)據(jù)庫(kù)中)的接口。一個(gè)單獨(dú)的視圖對(duì)象可管理數(shù)據(jù)顯示,包括從在窗口中呈現(xiàn)數(shù)據(jù)到用戶選擇和數(shù)據(jù)編輯。該視圖從文檔獲取顯示數(shù)據(jù),并將任何數(shù)據(jù)更改傳遞回文檔。MVC架構(gòu)(1)·MVC(Model-View-Controller,模型—視圖—控制器模式)是軟件工程中的一種軟件架構(gòu)模式。它把軟件系統(tǒng)分為三個(gè)基本部分:模型(Model),視圖(View)和控制器(Controller)。MVC架構(gòu)(2)其目的是實(shí)現(xiàn)一種動(dòng)態(tài)的程式設(shè)計(jì),使后續(xù)對(duì)程序的修改和擴(kuò)展簡(jiǎn)化,并且使程序某一部分的重復(fù)利用成為可能。除此之外此模式通過(guò)對(duì)復(fù)雜度的簡(jiǎn)化使程序結(jié)構(gòu)更加直觀。軟件系統(tǒng)通過(guò)對(duì)自身基本部份分離的同時(shí)也賦予了各個(gè)基本部分應(yīng)有的功能。專業(yè)人員可以通過(guò)自身的專長(zhǎng)分組:*控制器-負(fù)責(zé)轉(zhuǎn)發(fā)請(qǐng)求,對(duì)請(qǐng)求進(jìn)行處理。*視圖-界面設(shè)計(jì)人員進(jìn)行圖形界面設(shè)計(jì)。 *模型-程序員編寫程序應(yīng)有的功能(實(shí)現(xiàn)算法等等)、數(shù)據(jù)庫(kù)專家進(jìn)行數(shù)據(jù)管理和數(shù)據(jù)庫(kù)設(shè)計(jì)(可以實(shí)現(xiàn)具體的功能)。MVC和DOCUMENT/VIEW的關(guān)系Document/View架構(gòu)是MVC的一種變體,因?yàn)樵趲追NGUI平臺(tái)中,窗口顯示和事件處理是交織在一起的。MFCDocument/View架構(gòu)是 期對(duì)于MVC的實(shí)現(xiàn),MFC將程式分成View以及Document兩大類,其中的Document對(duì)應(yīng)MVC中的Model,View相當(dāng)于MVC中的View+Controller。DOCUMENT/VIEW的優(yōu)勢(shì)在需要同一文檔的多個(gè)視圖時(shí),例如同時(shí)需要電子數(shù)據(jù)表格和圖表視圖。文檔/視圖模型使一個(gè)單獨(dú)的視圖對(duì)象得以表示每個(gè)數(shù)據(jù)視圖,而對(duì)所有視圖通用的代碼(例如計(jì)算引擎)可以駐留在文檔中。文檔還承擔(dān)在每次數(shù)據(jù)更改時(shí)更新所有視圖的任務(wù)。MFC文檔/視圖結(jié)構(gòu)使支持多視圖、多文檔類型、拆分窗口和其他有價(jià)值的用戶界面功能變得容易。二、基于文檔視結(jié)構(gòu)的程序框架構(gòu)成//standard

SDI

Main

Frame//stardard

MDI

Main

Frame//

standard

MDI

child

Frame文檔class

CDocument;視圖class

CView;框架類class

CFrameWnd;class

CMDIFrameWnd;class

CMDIChildWnd;應(yīng)用程序類class

WinApp二、基于文檔視結(jié)構(gòu)的程序框架構(gòu)成SDICDocumentCViewCWinAppCMainFrame--派生自CFrameWnd二、基于文檔視結(jié)構(gòu)的程序框架構(gòu)成MDICDocumentCViewCWinAppCMainFrame--派生自CFrameWnd:主框架類CChildFrame—派生自CMDIChildWnd:子框架類三、文檔視結(jié)構(gòu)的運(yùn)行機(jī)制(方式)1)視圖類調(diào)用GetDocument成員函數(shù)獲得相關(guān)聯(lián)的文檔對(duì)象指針,從文檔中讀取數(shù)據(jù)。2)視圖把數(shù)據(jù)顯示在屏幕上 用戶交互 數(shù)據(jù)修改。3)視圖將經(jīng)過(guò)修改的數(shù)據(jù)傳遞給文檔對(duì)象,進(jìn)行數(shù)據(jù)更新。CDOCTEMPLATE(1)CDocTemplate(或CSingleDocTemplate或CMultiDocTemplate)支持一個(gè)對(duì)象,該對(duì)象協(xié)調(diào)給定類型的一個(gè)或多個(gè)現(xiàn)有文檔并對(duì)創(chuàng)建該類型的正確文檔、視圖和框架窗口對(duì)象進(jìn)行管理。CDocTemplate是一個(gè)抽象基類,它定義了文檔模板的基本處理函數(shù)接口。對(duì)一個(gè)單文檔界面程序,需使用單文檔模板類CSingleDocTemplate,而對(duì)于一個(gè)多文檔界面程序,需使用多文檔模板類CMultipleDocTemplate。CDOCTEMPLATE(2)·文檔模板掛接了文檔、視圖和框架窗口,使得它們得以互相關(guān)聯(lián)。通過(guò)文檔模板,程序確定了創(chuàng)建或打開(kāi)一個(gè)文檔時(shí),以什么樣的視圖和框架窗口來(lái)顯示。文檔模板依靠保存相互對(duì)應(yīng)的文檔、視圖和框架窗口的CRuntimeClass對(duì)象指針來(lái)實(shí)現(xiàn)上述掛接,這就是文檔模板類中的成員變量m_pDocClass、m_pFrameClass、m_pViewClass的由來(lái)。CDOCUMENT(1)·CDocument(或COleDocument)類支持用于存儲(chǔ)或控制程序數(shù)據(jù)的對(duì)象,并為程序員定義的文檔類提供基本功能。在"文檔/視圖"架構(gòu)的MFC程序中,文檔是一個(gè)CDocument派生對(duì)象,它負(fù)責(zé)存儲(chǔ)應(yīng)用程序的數(shù)據(jù),并把這些信息提供給應(yīng)用程序的其余部分。CDocument類對(duì)文檔的建立及歸檔提供支持并提供了應(yīng)用程序用于控制其數(shù)據(jù)的接口。CDOCUMENT(2)文檔表示數(shù)據(jù)單元,用戶一般用“文件”菜單上的“打開(kāi)”命令打開(kāi)它,并用“文件”菜單上的“保存”命令保存它。一個(gè)文檔可以有多個(gè)視圖,每一個(gè)文檔都維護(hù)一個(gè)與之相關(guān)視圖的鏈表(CptrList類型的m_viewList實(shí)例)。CDocument::AddView將一個(gè)視圖連接到文檔上,并將視圖的文檔指針指向該文檔。文檔與視圖進(jìn)行通信的方式是調(diào)用文檔類的UpdateAllViews函數(shù)。CVIEW(1)·CView(或它的許多派生類之一)為程序員定義的視圖類提供基本功能。視圖被附加到文檔并在文檔和用戶之間充當(dāng)中介:視圖在屏幕上呈現(xiàn)文檔的圖像并將用戶輸入解釋為對(duì)文檔的操作。視圖還為打印和打印預(yù)覽呈現(xiàn)圖像。CVIEW(2)在MFC"文檔/視圖"架構(gòu)中,CView類是所有視圖類的基類,它提供了用戶自定義視圖類的公共接口。在"文檔/視圖"架構(gòu)中,文檔負(fù)責(zé)管理和維護(hù)數(shù)據(jù);而視圖類則負(fù)責(zé)如下工作:從文檔類中將文檔中的數(shù)據(jù)取出后顯示給用戶;接受用戶對(duì)文檔中數(shù)據(jù)的編輯和修改;將修改的結(jié)果反饋給文檔類,由文檔類將修改后的內(nèi)容保存到磁盤文件中。文檔負(fù)責(zé)了數(shù)據(jù)真正在永久介質(zhì)中的存儲(chǔ)和讀取工作,視圖呈現(xiàn)只是將文檔中的數(shù)據(jù)以某種形式向用戶呈現(xiàn),因此一個(gè)文檔可對(duì)應(yīng)多個(gè)視圖。CVIEW(3)·CView類首先要維護(hù)文檔與視圖之間的關(guān)聯(lián),它通過(guò)CDocument*m_pDocument保護(hù)性成員變量記錄關(guān)聯(lián)文檔的指針,并提供CView::GetDocument接口函數(shù)以使得應(yīng)用程序可得到與視圖關(guān)聯(lián)的文檔。而在CView類的析構(gòu)函數(shù)中,需將對(duì)應(yīng)文檔類視圖列表中的本視圖刪除。CVIEW(4)CView中地位最重要的函數(shù)是virtualvoidOnDraw(CDC*pDC)=0;CView是一個(gè)純虛基類。這個(gè)函數(shù)必須被重載,它通常執(zhí)行如下步驟:以GetDocument()函數(shù)獲得視圖對(duì)應(yīng)文檔的指針;讀取對(duì)應(yīng)文檔中的數(shù)據(jù);顯示這些數(shù)據(jù)。CVIEW(5)CView::OnUpdate函數(shù)在文檔的數(shù)據(jù)被改變的時(shí)候被調(diào)用(即它被用來(lái)通知一個(gè)視圖的關(guān)聯(lián)文檔的內(nèi)容已經(jīng)被修改),它預(yù)示著我們需要重新繪制視圖以顯示變化后的數(shù)據(jù)。其中的Invalidate(TRUE)將整個(gè)窗口設(shè)置為需要重繪的無(wú)效區(qū)域,它會(huì)產(chǎn)生WM_PAINT消息,這樣OnDraw將被調(diào)用。假如文檔中的數(shù)據(jù)發(fā)生了變化,必須通知所有鏈接到該文檔的視圖,這時(shí)候文檔類的UpdateAllViews函數(shù)需要被調(diào)用。CFRAMEWND(1)在MFC中,文檔是真正的數(shù)據(jù)載體,視圖是文檔的顯示界面,對(duì)應(yīng)同一個(gè)文檔,可能存在多個(gè)視圖界面,我們需要另外一種東西來(lái)將這些界面管理起來(lái),這個(gè)東西就是框架。CFrameWnd(或其變體之一)支持在文檔的一個(gè)或多個(gè)視圖周圍提供框架的對(duì)象。CFRAMEWND(2)MFC創(chuàng)造框架類的初衷在于:把界面管理工作獨(dú)立出來(lái)!框架窗口為應(yīng)用程序的用戶界面提供結(jié)構(gòu)框架,它是應(yīng)用程序的主窗口,負(fù)責(zé)管理其包容的窗口。一個(gè)應(yīng)用程序啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)最頂層的框架窗口。MFC提供兩種類型的框架窗口:?jiǎn)挝臋n窗口SDI和多文檔窗口MDI(你可以認(rèn)為對(duì)話框是另一種框架窗口)。單文檔窗口一次只能打開(kāi)一個(gè)文檔框架窗口,而多文檔窗口應(yīng)用程序中可以打開(kāi)多個(gè)文檔框架窗口,即子窗口(ChildWindow)。這些子窗口中的文檔可以為同種類型,也可以為不同類型。模板、文檔、視圖、框架的關(guān)系(1)文檔保留該文檔的視圖列表和指向創(chuàng)建該文檔的文檔模板的指針;文檔至少有一個(gè)相關(guān)聯(lián)的視圖,而視圖只能與一個(gè)文檔相關(guān)聯(lián)。(2)視圖保留指向其文檔的指針,并被包含在其父框架窗口中;(3)文檔框架窗口(即包含視圖的MDI子窗口)保留指向其當(dāng)前活動(dòng)視圖的指針;(4)文檔模板保留其已打開(kāi)文檔的列表,維護(hù)框架窗口、文檔及視圖的映射;(5)應(yīng)用程序保留其文檔模板的列表。消息流動(dòng)機(jī)制在基于"文檔/視圖"架構(gòu)的MFC程序中,用戶消息(鼠標(biāo)、鍵盤輸入等)會(huì)先發(fā)往視圖,如果視圖未處理則會(huì)發(fā)往框架窗口。所以,一般來(lái)說(shuō),消息映射宜定義在視圖中。另外,如果一個(gè)應(yīng)用同時(shí)擁有多個(gè)視圖而當(dāng)前活動(dòng)視圖沒(méi)有對(duì)消息進(jìn)行處理則消息也會(huì)發(fā)往框架窗口。完整的WM_COMMAND消息的處理順序是"視圖――文檔――框架窗口――應(yīng)用"。四、文檔視結(jié)構(gòu)中各類的重要函數(shù)幾個(gè)重要的函數(shù)CView類的OnInitialUpdateCView類的OnDrawCView類的GetDocumentCDocument類的UpdateAllViewsCView類的OnUpdate四、文檔視結(jié)構(gòu)中各類的重要函數(shù)CView類::OnInitialUpdate 當(dāng)視圖第一次與一個(gè)文檔相關(guān)聯(lián),在視圖尚未顯示前,調(diào)用該函數(shù)。CView基類中的成員函數(shù)OnInitialUpdate()的作用就是調(diào)用OnUpdate()函數(shù)。 可以用派生類的OnInitialUpdate()函數(shù)對(duì)視圖對(duì)象進(jìn)行初始化。當(dāng)應(yīng)用程序啟動(dòng)時(shí),應(yīng)用程序框架調(diào)用了OnCreate()函數(shù)之后,會(huì)立刻調(diào)用OnInitialUpdate()函數(shù)。四、文檔視結(jié)構(gòu)中各類的重要函數(shù)CView::OnDraw應(yīng)用程序幾乎所有的繪制工作都是在視圖類的OnDraw()函數(shù)中完成的。每次當(dāng)視窗被重新繪制時(shí),應(yīng)用程序框架都要調(diào)用函數(shù)OnDraw()。當(dāng)用戶改變了窗口尺寸,或者窗口恢復(fù)了以前被遮蓋的部分,或者當(dāng)應(yīng)用程序改變了窗口的數(shù)據(jù)時(shí),窗口都需要被重新繪制。視圖類所繼承的Invalidate或InvalidateRect成員調(diào)用后會(huì)觸發(fā)對(duì)函數(shù)OnDraw的調(diào)用。四、文檔視結(jié)構(gòu)中各類的重要函數(shù)CView::GetDocument 一個(gè)視圖對(duì)象只有一個(gè)與之相聯(lián)系的文檔對(duì)象,CView及其派生類只需調(diào)用GetDocument()函數(shù)就可以取得CDocument類的對(duì)象指針,從而用此指針來(lái)訪問(wèn)文檔類中的所有可見(jiàn)的數(shù)據(jù)和文檔類公有成員函數(shù)。四、文檔視結(jié)構(gòu)中各類的重要函數(shù)CDocument::UpdateAllViews一個(gè)文檔對(duì)象可以有多個(gè)視圖對(duì)象與之對(duì)應(yīng),所以當(dāng)文檔數(shù)據(jù)發(fā)生了改變,則必須要通知所有的視圖對(duì)象,以便它們能對(duì)所顯示的數(shù)據(jù)進(jìn)行相應(yīng)的更新。UpdateAllViews()函數(shù)調(diào)用每個(gè)視圖的成員函數(shù)OnUpdate()對(duì)相應(yīng)視圖進(jìn)行更新。四、文檔視結(jié)構(gòu)中各類的重要函數(shù)CView::OnUpdate當(dāng)應(yīng)用程序調(diào)用了CDocument類的UpdateAllViews()函數(shù)時(shí),應(yīng)用程序框架就會(huì)相應(yīng)的調(diào)用此函數(shù)。通常在派生視圖類中的OnUpdate()函數(shù)要對(duì)文檔進(jìn)行訪問(wèn),讀取文檔的數(shù)據(jù),然后再對(duì)視圖的數(shù)據(jù)成員或控制進(jìn)行更新,以便反映出文檔的變化。附錄從該對(duì)象如何訪問(wèn)其他對(duì)象全局函數(shù)調(diào)用全局函數(shù)AfxGetApp可以得到CWinApp應(yīng)用類指針應(yīng)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論