




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、q 學生信息管理學生信息管理第第9單元單元 文檔視圖結構文檔視圖結構我們已經(jīng)知道,利用MFC向導可以開發(fā)二種類型的文檔/視圖結構的應用程序: q 基于SDI的應用程序用戶一次只能打開一個文檔;若已經(jīng)打開一個文檔,想打開另一個文檔時,必須關閉當前打開的文檔。q 基于MDI的應用程序用戶一次可以打開多個文檔;若已經(jīng)打開一個文檔,又想打開另一個文檔時,不必關閉當前打開的文檔;它體現(xiàn)了Windows操作系統(tǒng)的多任務特點。9.1 基本概念基本概念一、初識文檔和視圖一、初識文檔和視圖 文檔:是應用程序的數(shù)據(jù)元素的集合; 視圖:是數(shù)據(jù)的用戶界面:通過窗口顯示;通過打印機打??;提供用戶與文檔中數(shù)據(jù)的交互功能。
2、9.1 基本概念基本概念圖圖1文檔文檔/視圖關系示意圖視圖關系示意圖 9.1 基本概念基本概念文檔文檔/視圖結構視圖結構數(shù)據(jù)的維護維護及其顯示顯示分別由文檔文檔和視圖視圖負責。 文檔對象:代表打開的一個文件; 視圖對象:文檔的可視化表現(xiàn)形式。文檔文檔/視圖關系視圖關系是一對多的關系,即: 一個文檔可以對應多個視圖。比如一個*.HTML文件,在瀏覽瀏覽器里器里和在記事本中記事本中打開的表現(xiàn)形式是不同的,但操作的是同一個文件。 一個視圖只能對應一個文檔。9.1 基本概念基本概念視圖視圖通過GetDocument成員函數(shù)獲得指向獲得指向相關聯(lián)的文檔對象的指針文檔對象的指針通過該指針調用文檔類的成員函
3、數(shù)來從文從文檔中讀取數(shù)據(jù)檔中讀取數(shù)據(jù)視圖視圖把數(shù)據(jù)顯示數(shù)據(jù)顯示于計算機屏幕上用戶用戶通過與視圖的交交互互來查看數(shù)據(jù),并對數(shù)據(jù)進行修改視圖通過相關聯(lián)的文檔類的成員函數(shù),將經(jīng)過修改修改的數(shù)據(jù)數(shù)據(jù)傳遞給文檔對象文檔對象獲得修改過的數(shù)據(jù)數(shù)據(jù)之后,對其進行必要的修改,最后保存保存到永久介質(如磁盤文件)中二、文檔二、文檔/視圖結構的工作機理視圖結構的工作機理圖圖2文檔文檔/視圖工作流程視圖工作流程 三、文檔三、文檔/視圖的協(xié)作關系視圖的協(xié)作關系9.1 基本概念基本概念l文檔:文檔:數(shù)據(jù)定義、初始化;l視圖:視圖:數(shù)據(jù)顯示、修改、交互;在視圖類的成員函數(shù)中,可以: 訪問文檔類中的數(shù)據(jù):得到指向文檔類的指針
4、(pDoc),并通過該指針訪問文檔類中的數(shù)據(jù)。 若要刷新顯示,需要用Invalidate或InvalidateRect發(fā)出重畫重畫消息,引起對OnDraw的調用。 數(shù)據(jù)操作與數(shù)據(jù)顯示分離數(shù)據(jù)操作與數(shù)據(jù)顯示分離。由于數(shù)據(jù)操作與數(shù)據(jù)顯示分別按標準方法封裝于兩個不同類型的對象中,因而這兩項任務的工作量都被大大簡化了,各個對象單獨存在,而不是將兩種代碼混在一起。一般說來,對那些有大量數(shù)據(jù)需要管理、或數(shù)據(jù)顯示非常復雜的應用,文檔視結構顯得尤為有用。 許多許多MFC類對公共的文檔視圖活動提供了大量的幫助類對公共的文檔視圖活動提供了大量的幫助。例如,對文件的操作(選擇文件、打開文件和關閉文件)完全由框架類來
5、管理。用戶所需做的僅僅是從數(shù)據(jù)流中讀寫所需要的字節(jié),這種工作方法可以省略相同代碼的重復編寫,而將更多的時間用于編寫應用程序的特殊代碼上。四、文檔四、文檔/視圖結構的優(yōu)點視圖結構的優(yōu)點9.1 基本概念基本概念一、框架窗口類一、框架窗口類9.2 主體類介紹主體類介紹1. 框架窗口的組成框架窗口的組成框架窗口包括應用程序主窗口應用程序主窗口和文檔窗口文檔窗口。q 在單文檔的應用程序中,應用程序主窗口和文檔窗口是一致的。q 多文檔應用程序中的框架窗口包括兩個兩個:主框架窗口類,從多文檔主框架窗口CMDIFrameWnd繼承而來。子框架窗口類,從多文檔子框架窗口CMDIChildWnd繼承而來??蚣艽翱?/p>
6、,可以看作是視圖的容器。q 為視圖提供可視的邊框提供可視的邊框包括標題欄、一些標準的窗口組件(最大、最小化按鈕、關閉按鈕),像一個容器一樣把視圖包裝起來;q 響應標準的窗口消息響應標準的窗口消息包括最大化、最小化、調整尺寸等。當框架窗口關閉時,其中的視圖對象也被自動刪除。 q 對于框架窗口,程序要完成的主要工作是設置窗口外觀,MDI應用程序還要維護活動文檔窗口和非活動文檔窗口之間的切換,對于框架所圍的內容則由視圖類來管理。9.2 主體類介紹主體類介紹2. 框架窗口的作用框架窗口的作用q 應用程序框架窗口都是使用“動態(tài)建立宏動態(tài)建立宏”來動態(tài)建立的。q SDI只有一個框架窗口(應用程序主窗口和文
7、檔窗口合一),它隨著應用程序的運行而創(chuàng)建,隨著應用程序的結束而銷毀;q MDI框架窗口包含應用程序主窗口和文檔窗口:應用程序主窗口:應用程序主窗口:隨著應用程序的運行而建立,隨著應用程序的結束而銷毀;文檔窗口:文檔窗口:則是在用戶打開文檔或創(chuàng)建新文檔時建立,文檔關閉則文檔窗口也隨之關閉。3. 框架窗口的創(chuàng)建和清除框架窗口的創(chuàng)建和清除9.2 主體類介紹主體類介紹q 對MDI的主程序窗口來說,工具欄、狀態(tài)欄等都是子窗口。q 特殊的子窗口:MDI客戶窗口,它是MDI子窗口的直接父窗口,負責管理應用程序主窗口的客戶區(qū)以及創(chuàng)建子窗口。每個MDI主窗口都有且僅有一個MDI客戶窗口。q MDI子窗口用于容納
8、視圖和文檔。在任何時候,最多只有一個子窗口是活動的。其派生類MDI客戶窗口,還有自己的子窗口文檔窗口。文檔窗口同樣有自己的子窗口視圖。父窗口管理子窗口的定位,并向子窗口傳送命令消息。q 在任何情況下,調用AfxGetMainFrame()函數(shù)可以獲得應用程序的主窗口指針,通過該指針可以對框架窗口進行各種操作。4. 框架窗口的子窗口框架窗口的子窗口9.2 主體類介紹主體類介紹q 常見的交互對象菜單、工具欄和狀態(tài)欄,它們都是靠框架窗口來管菜單、工具欄和狀態(tài)欄,它們都是靠框架窗口來管理的。理的。q 工具欄按鈕和菜單項的更新:ON_UPDATE_COMMAND_UIq 消息可以在框架窗口類中處理,框架
9、窗口還將狀態(tài)欄定位在自己客戶區(qū)的底部,并管理狀態(tài)欄的顯示單元。5. 框架窗口與用戶交互對象框架窗口與用戶交互對象9.2 主體類介紹主體類介紹若主窗口沒有文檔窗口,主窗口顯示一個缺省的菜單條;否則,主窗口若主窗口沒有文檔窗口,主窗口顯示一個缺省的菜單條;否則,主窗口的菜單條會被當前活動的文檔窗口的菜單條取代。的菜單條會被當前活動的文檔窗口的菜單條取代。如果如果MDI程序支持多種文檔類型,各類型的文檔窗口用自身的菜單條來程序支持多種文檔類型,各類型的文檔窗口用自身的菜單條來取代主窗口的菜單條,并改變主窗口的標題欄。取代主窗口的菜單條,并改變主窗口的標題欄。9.2 主體類介紹主體類介紹6. 對對MD
10、I應用程序,應用程序主窗口管理菜單欄和標題欄應用程序,應用程序主窗口管理菜單欄和標題欄文檔類負責管理文檔,用戶的文檔類一般要從文檔類負責管理文檔,用戶的文檔類一般要從CDocument繼承。該類繼承。該類封裝了用戶定義的文檔類的基本功能,它支持標準的封裝了用戶定義的文檔類的基本功能,它支持標準的Windows操作,如操作,如建立建立(New)、打開、打開(Open)和保存和保存(Save)文檔等。文檔等。9.2 主體類介紹主體類介紹二、文檔類二、文檔類9.2 主體類介紹主體類介紹1. 派生關系派生關系圖圖3文檔類繼承派生關系圖文檔類繼承派生關系圖9.2 主體類介紹主體類介紹2. 一般方法一般方
11、法 方法方法說明說明GetTitle()獲得文檔標題SetTitle()設置文檔標題GetPathName()獲得文檔數(shù)據(jù)文件的路徑字符串SetPathName()設置文檔數(shù)據(jù)文件的路徑字符串GetDocTemplate()獲得指向描述文檔類型的文檔模板的指針AddView()對與文檔相關聯(lián)的視圖列表添加指定的視圖RemoveView()從文檔視圖列表中刪除視圖UpdateAllViews()通知所有視圖,文檔己被修改,它們應該重畫DisconnectViews()使文檔與視圖相分離GetFile()獲得指向 CFile 類型的指針9.2 主體類介紹主體類介紹3. 虛擬方法虛擬方法方法說明On
12、NewDocument()由 MFC 調用來 建立 文檔OnOpenDocument()由 MFC 調用來 打開 文檔OnSaveDocument()由 MFC 調用來 保存 文檔OnCloseDocument()由 MFC 調用來 關閉 文檔CanCloseFrame()確定觀察文檔的框架窗口是否被允許關閉DeleteContents()在未撤消文檔對象時刪除文檔數(shù)據(jù)ReleaseFile()釋放文件以允許其它應用程序使用SaveModified()查詢文檔的修改狀態(tài)并存儲修改的文檔IsModified ()確定文檔從它最后一次存儲后是否被修訂過SetModifiedFlag ()設置文檔從
13、它最后一次存儲后是否被修訂過的布爾值GetFirstViewPosition()獲得視圖列表頭的位置GetNextView()獲得視圖列表的下一個視圖9.2 主體類介紹主體類介紹4. 構造文檔類的派生類構造文檔類的派生類構造構造CDocument類的派生類的典型步驟為:類的派生類的典型步驟為:q 為每一個文檔類型從為每一個文檔類型從CDocument類派生一個相應的文檔類;類派生一個相應的文檔類;q 為文檔類添加成員變量。為文檔類添加成員變量。這些成員變量用來保存文檔的數(shù)據(jù),其它對象這些成員變量用來保存文檔的數(shù)據(jù),其它對象(如與文檔相關聯(lián)的視圖如與文檔相關聯(lián)的視圖)直接或間接地訪問這些成員變量
14、來讀取或更新文檔的數(shù)據(jù);直接或間接地訪問這些成員變量來讀取或更新文檔的數(shù)據(jù);q 重載重載Serialize成員函數(shù),實現(xiàn)文檔數(shù)據(jù)的串行化。成員函數(shù),實現(xiàn)文檔數(shù)據(jù)的串行化。視圖是數(shù)據(jù)的用戶窗口,為用戶提供了文檔可視的數(shù)據(jù)顯示,它把文檔視圖是數(shù)據(jù)的用戶窗口,為用戶提供了文檔可視的數(shù)據(jù)顯示,它把文檔的部分或全部內容在窗口中顯示出來。的部分或全部內容在窗口中顯示出來。視圖還給用戶提供了一個與文檔中的數(shù)據(jù)交互界面,它把用戶的輸入轉視圖還給用戶提供了一個與文檔中的數(shù)據(jù)交互界面,它把用戶的輸入轉化為對文檔中數(shù)據(jù)的操作?;癁閷ξ臋n中數(shù)據(jù)的操作。1. 視圖類視圖類視圖類視圖類CView為用戶定義的視圖類提供了基
15、本的功能,它被連接到文檔為用戶定義的視圖類提供了基本的功能,它被連接到文檔上,用作文檔和用戶之間的媒介。視圖是框架窗口的子窗口。上,用作文檔和用戶之間的媒介。視圖是框架窗口的子窗口。視圖類視圖類CView是是MFC中負責管理視圖窗口的基類,其它視圖類都由此派中負責管理視圖窗口的基類,其它視圖類都由此派生。生。CView的主要功能是顯示和修改文檔的數(shù)據(jù),它對文檔數(shù)據(jù)的存儲的主要功能是顯示和修改文檔的數(shù)據(jù),它對文檔數(shù)據(jù)的存儲沒有支持。沒有支持。三、視圖類三、視圖類9.2 主體類介紹主體類介紹9.2 主體類介紹主體類介紹2. 派生關系派生關系圖圖4視圖類繼承派生關系圖視圖類繼承派生關系圖9.2 主體
16、類介紹主體類介紹3. 一般方法一般方法方法方法說說 明明GetDocument獲得指向與視圖相關聯(lián)的文檔的指針DoPreparePrinting設置文檔標題9.2 主體類介紹主體類介紹4. 主要虛擬方法主要虛擬方法方法方法說說 明明IsSelected確定文檔是否被選中OnScroll當用戶滾動時,CView的響應OnInitialUpdate在類第一次構造后由MFC調用OnDraw由MFC調用發(fā)出文檔到設備描述表OnUpdate由MFC調用對文檔的修改進行響應OnPrepareDC在調用OnDraw()前允許修改設備描述表由MFC調用 CScrollView:滾動視類; CEditView:
17、編輯視圖類; CFormView:一種可以滾動的視圖,其中包括了對話框控件; CHtmlView:該類提供了Web瀏覽器的功能。9.2 主體類介紹主體類介紹 從基類CView派生了如下常用的視圖類:5. 視圖類的派生類視圖類的派生類9.2 主體類介紹主體類介紹四、文檔模板類四、文檔模板類CDocTemplate類類1. 派生關系派生關系CDocTemplate類的基類類的基類為為CCmdTarget。圖圖5文檔模板類繼承派生關系圖文檔模板類繼承派生關系圖9.2 主體類介紹主體類介紹2. 基本函數(shù)基本函數(shù)方法方法說明說明GetDocString ()獲得與文檔相關的字符串獲得與文檔相關的字符串L
18、oadTemplate()加載指定的模板加載指定的模板AddDocument ()給文檔模板添加指定的模板給文檔模板添加指定的模板RemoveDocument ()從文檔模板列表中刪除文檔從文檔模板列表中刪除文檔GetFirstDocPosition()獲得與文檔模板相關的第一個文檔的位置獲得與文檔模板相關的第一個文檔的位置GetNextDoc()獲得文檔及下一個文檔獲得文檔及下一個文檔CreateNew Document()建立文檔建立文檔CreateNewFrame ()建立包含文檔和視圖的框架窗口建立包含文檔和視圖的框架窗口OpenDocumentFile ()打開由路徑名指定的文檔打開
19、由路徑名指定的文檔Close All Document()關閉所有文檔關閉所有文檔SetDefaultTitle()顯示文檔窗口的標題欄中默認的標題顯示文檔窗口的標題欄中默認的標題Save All Modified()查詢文檔模板的修改狀態(tài)并存儲與之關聯(lián)的所有文檔查詢文檔模板的修改狀態(tài)并存儲與之關聯(lián)的所有文檔9.2 主體類介紹主體類介紹3. 功能功能 在VC中,文檔類、視圖類以及框架窗口類都是由文檔模板創(chuàng)建的。每一種文檔類型都有一種文檔模板與之相對應,文檔模板負責創(chuàng)建和管理該文檔類型的所有文檔。 文檔、框架窗口和視圖的創(chuàng)建過程創(chuàng)建過程之間的先后順序先后順序為:創(chuàng)建文檔;創(chuàng)建框架窗口;1)創(chuàng)建視
20、圖。9.2 主體類介紹主體類介紹 CDocTemplate (UINT nIDResource, /資源標識符資源標識符 CRuntimeClass* pDocClass,/指向派生指向派生文檔文檔類的對象的指針類的對象的指針 CRuntimeClass* pFrameClass, /指向派生指向派生框架框架類的對象的指針類的對象的指針 CRuntimeClass* pViewClass /指向派生指向派生視圖視圖類的對象的指針類的對象的指針 ); 它們之間的聯(lián)系是通過文檔模板的構造函數(shù)文檔模板的構造函數(shù)來實現(xiàn)的。文檔模板的構造函數(shù)的原型如下:4. 構造函數(shù)構造函數(shù)9.2 主體類介紹主體類介紹
21、BOOL CMyEditApp:InitInstance() CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyEditDoc),RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CMyEditView);AddDocTemplate(pDocTemplate); return TRUE;例如,在后面要介紹的的SDI工程MyEdit程序的InitInstance()方法中,通過使用單文檔模板的構造函數(shù)創(chuàng)建文檔模
22、板對象:9.2 主體類介紹主體類介紹BOOL CMymdiApp:InitInstance() CMultiDocTemplate* pDocTemplate2; pDocTemplate2 = new CMultiDocTemplate ( IDR_MYMDITYPE2, RUNTIME_CLASS(CMymdiDoc2), /MDI派生文檔類對象的指針 RUNTIME_CLASS(CChildFrame), /MDI派生子框架類對象指針 RUNTIME_CLASS(CMymdiView2)/MDI派生視圖類對象的指針 ); /使用AddDocTemplate()方法將新模板添加到應用程序的
23、文檔模板列表中 AddDocTemplate(pDocTemplate2); 而在MDI程序的InitInstance()方法中,通過使用多文檔模板的構造函數(shù)創(chuàng)建文檔模板對象:例1:創(chuàng)建一個基于單文檔的簡單的文本編輯器。(一)創(chuàng)建基于的(一)創(chuàng)建基于的MyEdit工程工程1.創(chuàng)建一個新的MFC AppWizard(exe)工程,工程名稱為MyEdit。 這一節(jié),我們主要通過二個實例二個實例來說明如何創(chuàng)建SDI應用程序。9.3 單文檔結構單文檔結構一、簡單的文本編輯器一、簡單的文本編輯器9.3 單文檔結構單文檔結構圖圖6新建新建MyEdit工程工程l在AppWizard的第一步中,選擇類型為單文
24、檔類型。l在AppWizard的第二步、第三步中使用缺省的選項;l在第四步中,單擊“高級高級”按鈕,彈出Advance Options對話框,在“文件擴展名”編輯框中輸入txt2,如下圖所示。9.3 單文檔結構單文檔結構圖圖7文件的高級選項對話框文件的高級選項對話框 9.3 單文檔結構單文檔結構以示與以示與.txt文件相區(qū)文件相區(qū)別別l 按“關閉關閉”按鈕。l AppWizard的第五步使用缺省的選項;l 在第六步中,將CMyEditView類的基類設置為CEditView后,按“完成”按鈕關閉該對話框。如下圖。9.3 單文檔結構單文檔結構9.3 單文檔結構單文檔結構圖圖8設置視圖的基類設置視
25、圖的基類 利用MFC AppWizard生成一個基于單文檔的應用程序后,打開WorkSpace中的ClassView選項頁,可以瀏覽到單文檔應用程序的一些核心的組成類,如圖所示。理解這些類及其之間的關系是理解該類應用程序的關鍵。 9.3 單文檔結構單文檔結構在余下的幾步中,全部使用默認值。最后單擊“Finish”按鈕,生成應用程序框架。 (二)五個類文件(二)五個類文件圖圖9SDI程序的主要類圖程序的主要類圖9.3 單文檔結構單文檔結構 向導生成的單文檔應用程序一般包括向導生成的單文檔應用程序一般包括5個類個類:應用程序類CMyEditApp:一個從CWinApp類派生的類,是全部應用程全部應
26、用程序的容器序的容器??蚣艽翱陬怌MainFrame:一個從CFrameWnd類派生的類。在SDI應用程序中,框架窗口就是應用程序的主窗口,主窗口就是應用程序直接放置于桌面上的那個窗口,每個應用程序只能有一個主窗口只能有一個主窗口,主窗口的標題欄上常常顯示應用程序的名稱。1.如在記事本程序中,新建一個文件后,主窗口的標題欄上顯示“無標題-記事本”。9.3 單文檔結構單文檔結構文檔類CMyEditDoc:從CDocument類繼承而來的類,存儲應用程序的數(shù)據(jù),并將這些信息提供給應用程序的其余部分。視圖類CMyEditView:從CEditView類派生而來的,CEditView類提供了基本的文本
27、編輯功能,是從CView類派生來的。視圖窗口與其父窗口框架窗口的客戶區(qū)域對齊,它接收用戶對應用程序的輸入并顯示相關聯(lián)的文檔數(shù)據(jù)。對話框類CAboutDlg:是從CDialog派生來的,該對話框類顯示一個簡單的版本信息的“關于”對話框。9.3 單文檔結構單文檔結構l編譯并運行上述程序,顯示結果如下圖所示。l在客戶區(qū)中輸入一些文本。9.3 單文檔結構單文檔結構(三)運行程序(三)運行程序9.3 單文檔結構單文檔結構圖圖10MyEdit的運行界面的運行界面 l 當單擊“文件|新建”,若剛才輸入的內容未保存,則出現(xiàn)提示框,詢問是否要保存:9.3 單文檔結構單文檔結構圖圖11保存提示框保存提示框l 若選
28、擇“否”,則放棄原文件,直接創(chuàng)建一個新的空白文件。若選擇“是”,則彈出“保存為”對話框,設置相關信息后,即保存文件。(如下圖)。(如下圖)。9.3 單文檔結構單文檔結構圖圖12保存設置對話框保存設置對話框顯然,顯然,這是一個典型的單文檔應用程序,同學們可以觀察它是否和記事本程序這是一個典型的單文檔應用程序,同學們可以觀察它是否和記事本程序的功能類似的功能類似。9.3 單文檔結構單文檔結構在在MyEdit應用程序的客戶區(qū)輸入一些文本后,可以通過菜單實現(xiàn)一些應用程序的客戶區(qū)輸入一些文本后,可以通過菜單實現(xiàn)一些操作。操作。如,單擊如,單擊“文件文件|保存保存”,則彈出如下圖所示的,則彈出如下圖所示的
29、“文件保存文件保存”對話框,對話框,將文件名編輯框中輸入一個文件名如將文件名編輯框中輸入一個文件名如YYY,則在制定的目錄下保存了,則在制定的目錄下保存了一個一個YYY.txt2文件。文件。其中其中保存類型保存類型編輯框中出現(xiàn)的的文字就是在圖編輯框中出現(xiàn)的的文字就是在圖7中的設置所起的作用。中的設置所起的作用。9.3 單文檔結構單文檔結構5. 保存文檔保存文檔圖圖13文件保存對話框文件保存對話框9.3 單文檔結構單文檔結構在在Window下,當我們直接雙擊剛才建立的文件下,當我們直接雙擊剛才建立的文件YYY.txt2,則該文件自,則該文件自動用程序動用程序MyEdit打開,和在打開,和在Win
30、dows下用鼠標雙擊某個下用鼠標雙擊某個.doc文件,則文件,則該文件自動用該文件自動用Word字處理程序打開類似。字處理程序打開類似。那么,該功能是怎樣實現(xiàn)的呢?那么,該功能是怎樣實現(xiàn)的呢?下面讓我們定位到下面讓我們定位到“應用程序類應用程序類”的的InitInstance()函數(shù)中,可以看到下函數(shù)中,可以看到下面的代碼:面的代碼:9.3 單文檔結構單文檔結構6. 討論討論BOOL CMyEditApp:InitInstance()EnableShellOpen(); /使得雙擊使得雙擊.txt2文件類型時能調用該工程文件類型時能調用該工程MyEdit打開打開RegisterShellFil
31、eTypes(TRUE); /在注冊表中注冊文件類型在注冊表中注冊文件類型.txt29.3 單文檔結構單文檔結構9.3 單文檔結構單文檔結構這個例子比較簡單,沒有涉及深入的操作內容。下面的例子將用到復雜一點的知識。例2:創(chuàng)建一個SDI應用程序,接受用戶鍵盤輸入,并在視圖窗口中顯示,可以實現(xiàn)保存,也可以從文件中讀取后顯示。l 創(chuàng)建一個新的MFC AppWizard(exe)工程,工程名稱為MySDI。1. 每一步選擇默認設置即可。9.3 單文檔結構單文檔結構圖圖14創(chuàng)建創(chuàng)建SDI工程工程9.3 單文檔結構單文檔結構在文檔類CMySDIDoc中創(chuàng)建鍵盤輸入存儲區(qū)。當用戶擊鍵時,輸入的字符數(shù)據(jù)將添加
32、到一個字符串中,然后在視圖中顯示該字符串。為此,需要定義一個字符串變量。過程如下。二、向文檔類添加成員變量二、向文檔類添加成員變量9.3 單文檔結構單文檔結構圖圖15添加類成員變量添加類成員變量9.3 單文檔結構單文檔結構圖圖16設置成員變量屬性設置成員變量屬性9.3 單文檔結構單文檔結構在文檔類的構造函數(shù)中,將該字符串設置為空。CMySDIDoc:CMySDIDoc()m_strText.Empty();9.3 單文檔結構單文檔結構由題意,需要重載視圖類CMySDIView的二個處理函數(shù): 接受鍵盤輸入的函數(shù):OnChar( ) 顯示數(shù)據(jù)的重畫函數(shù):OnDraw( )以OnChar( )為例
33、,說明操作過程。 選擇“CMySDIView”,單擊右鍵,彈出菜單,選擇Add Windows Message Handler三、向視圖類添加處理函數(shù)三、向視圖類添加處理函數(shù)9.3 單文檔結構單文檔結構圖圖17添加消息響應成員函熟添加消息響應成員函熟9.3 單文檔結構單文檔結構l 在顯示的消息中選擇“WM_CHAR”,如下圖。l 按下“Add and Edit”按鈕,返回“CMySDIView.CPP”文件的編輯環(huán)境,添加如下代碼。void CMySDIView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) CMySDIDoc* pDoc = Ge
34、tDocument();/獲得文檔對象指針ASSERT_VALID(pDoc);/確保pDoc指向當前視圖pDoc-m_strText+=nChar;/將鍵入的數(shù)據(jù)添加到字符串中Invalidate();/強迫調用OnDraw()函數(shù)CView:OnChar(nChar, nRepCnt, nFlags);9.3 單文檔結構單文檔結構圖圖18選擇選擇“擊鍵擊鍵”消息消息9.3 單文檔結構單文檔結構圖圖19添加代碼添加代碼9.3 單文檔結構單文檔結構l同樣方法,添加OnDraw()的代碼:lvoid CMySDIView:OnDraw(CDC* pDC)llCMySDIDoc* pDoc = G
35、etDocument();lASSERT_VALID(pDoc);llpDC-TextOut(0,0,pDoc-m_strText); l所謂序列化,實質上就是讓對象將其當前的狀態(tài)(由其成員變量的值表示)寫入到永久性存儲體永久性存儲體中,以后還可以從中讀出,重建對象。這種過程稱為 “序列化”。 MFC的應用程序架構提供了數(shù)據(jù)序列化的方式來處理磁盤的存盤與打開,序列化的大部分工作靠應用程序框架來完成,我們所要做的就是重載重載文檔類的序列化函數(shù)Serialize()。9.3 單文檔結構單文檔結構四、文檔序列化四、文檔序列化9.3 單文檔結構單文檔結構void CMySDIDoc:Serialize
36、(CArchive& ar)if (ar.IsStoring()arm_strText;9.3 單文檔結構單文檔結構運行程序,輸入“同學們好!”,顯示結果如下:圖圖20運行結果運行結果9.4 多文檔結構多文檔結構q 所謂多文檔(MDI),就是解決多個文檔的數(shù)據(jù)管理多個文檔的數(shù)據(jù)管理問題。q MDI應用程序必須有一個CMDIFrameWnd或其派生類的對象,該窗口稱作MDI框架窗口。q 多文檔程序最初的文檔模板只支持主窗口,但每次打開一個新文檔時都建立一個新的新的MDI子窗口子窗口,這些窗口中保存保存著各自打開的文檔各自打開的文檔,而所有的細節(jié)都由細節(jié)都由MFC庫處理庫處理。q MDI子窗口是C
37、MDIChildWnd或其派生類對象 。9.4 多文檔結構多文檔結構 CMyApp:應用程序類 CMainFrame:框架窗口,是MDI應用程序的主窗口 CChildFrame:子框架窗口用于容納視圖 CMyDoc:文檔類 CMyView:視圖類 CAboutDlg:“關于”對話框AppWizard可為MDI程序框架創(chuàng)建以下類:9.4 多文檔結構多文檔結構例3. 創(chuàng)建一個多文檔的應用程序。 創(chuàng)建創(chuàng)建MDI工程工程MyMDI_1圖圖21創(chuàng)建創(chuàng)建MDI工程工程9.4 多文檔結構多文檔結構(1)在向導的第一步中,選擇“多重文檔”:圖圖22選擇選擇“多重文檔多重文檔”9.4 多文檔結構多文檔結構(2)
38、其它的選擇默認值,最后得到MDI初始工程:圖圖23MDI工作界面工作界面9.4 多文檔結構多文檔結構(3)在視圖類CMyMDI_1View中添加代碼:void CMyMDI_1View:OnDraw(CDC* pDC)CMyMDI_1Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDC-TextOut(20,20,同學們好同學們好,歡迎學習歡迎學習MDI工程工程!); 9.4 多文檔結構多文檔結構(4)編譯,運行程序,結果如下:圖圖24運行結果運行結果1. 創(chuàng)建步驟創(chuàng)建步驟l 創(chuàng)建一個新的MFC AppWizard(exe)工程,工程名稱為MyWor
39、d。l 在AppWizard的第一步中,選擇類型為“多重文檔”類型。1) 第二步使用缺省的選項,在第三步中主要選擇如何支持復合檔支持的,我們選擇“容器容器”支持,如下圖所示,然后按“下一個下一個”按鈕。例4. 實現(xiàn)一個基于多文檔的豐富文本編輯器,可以在當前文檔中插入其 它的圖形、音頻等。9.4 多文檔結構多文檔結構圖圖25選擇如何支持復合文檔對話框選擇如何支持復合文檔對話框9.4 多文檔結構多文檔結構l 在第四步,單擊“高級高級”按鈕,彈出Advance Options對話框,在“文文件擴展名件擴展名”編輯框中輸入doc2,如圖所示。完后按“關閉關閉”按鈕。9.4 多文檔結構多文檔結構圖圖26
40、文件的高級選項對話框圖文件的高級選項對話框圖 l 第五步使用缺省選項;l 在第六步中,將CMyWordView類的基類設置為CRichEditView后,按Close按鈕關閉該對話框;9.4 多文檔結構多文檔結構圖圖27選擇選擇CRichEditViewl 在余下的幾步中,全部使用默認值;l 最后單擊“完成”按鈕,生成應用程序框架。9.4 多文檔結構多文檔結構圖圖28MyWord工程工程2. 主要組成類主要組成類應用程序類CMyWordApp是一個從CWinApp類派生的類,充當全部應用程序的容器。應用程序類負責唯一的全局應用程序對象的創(chuàng)建、初始化、運行和退出清理過程。Windows應用程序有
41、一個WinMain()函數(shù),它是整個應用程序的起點。使用VC的應用程序架構創(chuàng)建的MFC程序已經(jīng)封裝封裝了該函數(shù)。1)當程序被啟動時,WinMain()被自動執(zhí)行,進行一些標準的初始化工作,而把控制權轉移給應用程序對象。9.4 多文檔結構多文檔結構打 開 應 用 程 序 類 的 實 現(xiàn) 文 件 , 在 其 實 例 化 函 數(shù)InitInstance()前面有如下的一行代碼: CMyWordApp theApp; theApp是應用程序對象,是一個全局變量,先于其它對象被創(chuàng)建。該類有一個很重要的函數(shù)InitInstance(),在該函數(shù)中創(chuàng)建一個文檔模板,來管理文檔/視圖結構涉及的框架窗口、文檔和
42、視圖。 9.4 多文檔結構多文檔結構框架窗口類CMainFrame:是一個從CMDIFrameWnd類派生的類在MDI應用程序中,框架窗口就是應用程序的主窗口,主窗口就是應用程序直接放置于桌面上的哪個窗口,每個應用程序只能有一個主窗口,主窗口的標題欄上常常顯示應用程序的名稱。子框架窗口類CChildFrame:是一個從CMDIChildWnd類派生的類,在MDI應用程序中,子框架窗口是包含在MDI主窗口的一個子窗口,該子窗口不能有自己的菜單,但可以共享MDI主窗口的菜單。該窗口主要用來容納視圖窗口。9.4 多文檔結構多文檔結構文檔類CMyWordDoc:是從CRichEditDoc類繼承而來的
43、類,而CRichEditDoc又是從CDocument繼承而來的,它存儲應用程序的數(shù)據(jù)(可以包含音頻和視頻數(shù)據(jù),即可存儲豐富文本),并將這些信息提供給應用程序的其余部分。視圖類CMyWordView:是從CRichEditView類派生而來的,CRichEditView類提供了豐富的文本編輯功能(可以編輯圖形圖像數(shù)據(jù),即可編輯豐富文本),它是從CView類派生來的。視圖窗口與其父窗口框架子窗口的客戶區(qū)域對齊,它接收用戶對應用程序的輸入并顯示相關聯(lián)的文檔數(shù)據(jù)。對話框類CAboutDlg:是從CDialog派生來的,該對話框類顯示一個簡單的版本信息的“關于” 對話框類。9.4 多文檔結構多文檔結構3. 運行運行MDI應用程序應用程序編譯并運行上述程序,建立兩個文檔MyWord1與MyWord2,其中,在MyWord1中插入一個Excel圖表;MyWord2中插入離散數(shù)學中的“一階謂詞公式”。顯然,這是一個典型的多文檔應用程序,同時打開了兩個文檔。9.4 多文檔結構多文檔結構圖圖29 MyWord的運行結果的運行結果9.4 多文檔結構多文檔結構9.5 多視圖多視圖很多Windows應用軟件,如Word,可以開二個以上窗口。非常方便,也很美觀。這就是多視圖多視圖概
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理電動車合同范例
- 借名買房合同范本
- 租賃合同通知函
- 農(nóng)村收購單車合同范例
- 農(nóng)村果園承包合同范本
- 云平臺建設合同范本
- 云南租房合同范本
- 供應電水氣合同范本
- 水電站隧道排水孔施工方案
- 乙方裝修合同范本
- DeepSeek從入門到精通培訓課件
- 俄羅斯進口凍肉合同范例
- 2025年湖北省技能高考(建筑技術類)《建設法規(guī)》模擬練習試題庫(含答案)
- 急性呼衰院前急救流程
- 部編版七年級語文下冊《第2課說和做》課件
- 養(yǎng)老服務信息化發(fā)展-深度研究
- 2024-2025學年第二學期學??倓展ぷ饔媱潱ǜ?月-6月安排表行事歷)
- 夫妻離婚協(xié)議書范本2024
- GB/T 3920-2024紡織品色牢度試驗耐摩擦色牢度
- 交管12123學法減分題庫(含答案)
- 2025年蘇州工業(yè)職業(yè)技術學院高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
評論
0/150
提交評論