




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
2023/4/121面向?qū)ο笈c可視化
程序設(shè)計
--VisualC++編程
主講教師:
唐龍教授
(計算機科學(xué)與技術(shù)系)
黃維通博士
(計算機與信息管理中心)
清華大學(xué)
2001年2月2023/4/122第十六章
文檔類與視圖類及其應(yīng)用2023/4/123內(nèi)容提要概述文檔類視圖類文檔模板類編寫單文檔應(yīng)用程序編寫多文檔應(yīng)用程序2023/4/124§16.1.
概述
1.單文檔界面與多文檔界面VC的MFC庫支持三種不同的應(yīng)用程序單文檔界面(SDI)的應(yīng)用程序——只有一個窗口。多文檔界面(MDI)的應(yīng)用程序——有多個子窗口,同時對多個文檔進行操作?;趯υ捒虻膽?yīng)用程序使用AppWizard創(chuàng)建SDI和MDI的應(yīng)用程序的過程幾乎完全一樣。主要差別:SDI應(yīng)用程序的CMainFrame類的基類為CFrameWnd,不生成CChildFrame類。MDI應(yīng)用程序的CMainFrame類的基類為CMDIFrameWnd,生成CChildFrame類。2023/4/1262.視圖視圖是文檔的不同表現(xiàn)形式,每一個文檔可有多個視圖,但每個視圖只能對應(yīng)于一個確定的文檔。多文檔程序需要多個視圖,應(yīng)解決多個文檔的數(shù)據(jù)管理方法的問題。最初的文檔模板只支持主窗口;每次打開一個新文檔時都調(diào)用CDocument的函數(shù)OnNewDocument,建立一個由CMDIChildWnd派生的新的MDI子窗口;這些窗口中保存著各種已打開的文檔,所有的細節(jié)都由MFC庫處理。2023/4/1273.文檔-視圖結(jié)構(gòu)文檔-視圖結(jié)構(gòu)是基于文檔的應(yīng)用程序的基本框架。比傳統(tǒng)編程方法更有利于應(yīng)用程序。數(shù)據(jù)保存在文檔類的成員變量中,文檔負責(zé)對數(shù)據(jù)進行管理和維護:通過串行化過程,將數(shù)據(jù)保存到盤文件或數(shù)據(jù)庫;處理菜單、工具欄按鈕和加速鍵的WM_COMMAND消息,但不能處理其它的Windows消息。注意:命令消息不同于一般Windows消息和控件通知消息,可被更多種對象處理,除了窗口和視圖外,還有文檔、文檔模板或應(yīng)用程序本身。2023/4/1283.文檔-視圖結(jié)構(gòu)(續(xù))視圖在文檔和用戶之間起中介作用接收用戶的輸入,并接受用戶的修改;直接或間接的訪問文檔類中的成員變量,從文檔類中(不是從存儲介質(zhì)中)取數(shù)據(jù),并顯示之。注意:通過調(diào)用文檔和視圖的接口將修改的信息反饋給文檔類,實際的數(shù)據(jù)更新仍然是由文檔來完成的。2023/4/1294.文檔-視圖結(jié)構(gòu)的工作機制視圖通過GetDocument()獲得文檔的指針;通過指針調(diào)用文檔類的成員函數(shù)讀取文檔數(shù)據(jù);視圖把數(shù)據(jù)顯示于計算機屏幕上;用戶與視圖的交互,查看/修改數(shù)據(jù);視圖通過相關(guān)聯(lián)的文檔類的成員函數(shù),將修改后的數(shù)據(jù)傳遞給文檔對象;文檔對象獲得修改過的數(shù)據(jù)之后,進行必要的修改,最后,存到磁盤文件(永久介質(zhì)中)。2023/4/1210§16.2.
文檔及其派生類
2023/4/12111.文檔類所有文檔類都以CDocument類為基類。
CDocument類是CCmdTarget類派生的。在Afxwin.h中定義CDocument類。2023/4/12122.CDocument類的方法CDocument類提供了文檔類所需最基本功能,有兩類方法:一般方法;虛擬方法2023/4/12132023/4/12143.CDocument類的派生類構(gòu)造構(gòu)造CDocument類的派生類的基本步驟:為每一個文檔類型從CDocument類(或其派生類)派生一個相應(yīng)的文檔類;為文檔類添加成員變量。這些成員變量用來保存文檔的數(shù)據(jù);重載Serialize成員函數(shù),實現(xiàn)文檔數(shù)據(jù)的串行化。文檔的數(shù)據(jù)保存到成員變量,便于其他對象的訪問。串行化由函數(shù)Serialize()實現(xiàn),它有一個參數(shù)是與所打開的文件相關(guān)對象Carchive,進行文檔的讀或?qū)憜我徊僮鞯膶ο蟆?023/4/1215§16.3.
視圖及其派生類2023/4/12161.視圖類視圖類CView是CWnd類直接派生的。CView及其派生類都具有CWnd的所有功能,可接受任何Windows消息。在Afxwin.h中定義CView類。2023/4/12172.CView類的方法2023/4/12183.CView類的派生類CEditView——支持類似編輯控件所要實現(xiàn)的功能,常見的文本操作,多由該類實現(xiàn)。其直接基類不是CView類,而是類CCtrlView。CRichEditView——支持Rich文本操作。CTreeView——支持樹型控件所實現(xiàn)的功能,使數(shù)據(jù)的顯示方式更富于變化。ListView——類似于CTreeView,提供了一種簡捷地實現(xiàn)數(shù)據(jù)的不同顯示的途徑。CScrollView——提供視圖的滾動顯示。是CView直接派生類。注意:合理選擇CView或Cview派生類可省去許多編程工作量。2023/4/1219§16.4.
文檔模板類2023/4/12201.CDocTemplate類CDocTemplate類的基類為CCmdTarget。在Afxwin.h中定義CDocTemplate類。2023/4/12212.CDocTemplate類的基本函數(shù)2023/4/12223.CDocTemplate類的函數(shù)使用文檔類、視圖類及框架窗口都由文檔模板創(chuàng)建。每一種文檔類型都有與之相對應(yīng)的一種文檔模板,負責(zé)創(chuàng)建和管理該文檔類型的所有文檔。創(chuàng)建過程順序:創(chuàng)建文檔→創(chuàng)建框架窗口→創(chuàng)建視圖。文檔、視圖和框架窗口三者之間是相互關(guān)聯(lián)、相互協(xié)調(diào)的,彼此都包含了指向?qū)Ψ降闹羔槨?023/4/12233.CDocTemplate類的函數(shù)使用(續(xù))通過文檔模板的構(gòu)造函數(shù)來實現(xiàn)文檔、視圖和框架窗口之間的聯(lián)系,構(gòu)造函數(shù)的原型如下:CDocTemplate(UINTnIDResource,//各種資源的資源標識符
CRuntimeClass*pDocClass,//指向派生文檔類的指針
CRuntimeClass*pFrameClass,//指向派生框架類指針
CRuntimeClass*pViewClass//指向CView派生類指針);2023/4/1224
在應(yīng)用程序的InitInstance()函數(shù)中,通過使用文檔模板的構(gòu)造函數(shù)創(chuàng)建文檔模板的對象如下:BOOLCMymdiApp::InitInstance(){
…CMultiDocTemplate*pDocTemplate2;pDocTemplate2=newCMultiDocTemplate(IDR_MYMDITYPE2,//MDI派生文檔類的CRuntimeClass對象的指針
RUNTIME_CLASS(CMymdiDoc2),//MDI派生子框架類的CRuntimeClass對象的指針
RUNTIME_CLASS(CChildFrame),文檔模板的構(gòu)造函數(shù)2023/4/1225//創(chuàng)建文檔模板的對象
RUNTIME_CLASS(CMymdiView2));//然后,使用CwinApp::AddDocTemplate()函數(shù)//將新模板添加到應(yīng)用程序的文檔模板列表中。
AddDocTemplate(pDocTemplate2);
…
}2023/4/1226文檔模板字符串在資源文件中的定義了描繪文檔模板的信息,它由最多9個子串組成。其格式如下:nIDResource
<WindowTitle>\n//程序的標題欄上的標題
<DocName>\n //新文檔的默認名
<FileNewName>\n //文檔類型的名稱
<FilterName>\n //匹配此類型文檔的文件過濾器
<FilterExt>\n //文檔的文件擴展名
<RegFileTypeID>\n//寄存器中的文檔類型標識符
<RegFileTypeName>\n//寄存器中的文檔類型名稱
<FilterMacExt(FilterWinExt)>\n//允許從FilterName刪除的文件擴展名
<FilterMacName(FilterWinName)>//允許Macintosh的文件類型被指定在FilterExt中2023/4/1227§16.5.
編寫單文檔應(yīng)用程序2023/4/1228[例6-1]創(chuàng)建一個標題為“
MySdi”的應(yīng)用程序。主窗口中顯示一文本“您好,單文檔界面的例程!”?!熬庉嫛辈藛魏胁藛雾棥案淖冿@示文本”,單擊該項,彈出一個對話框,用以改變主窗口中的顯示文本。2023/4/1229程序添加如圖所示的對話框。并使用ClassWizard為對話框生成CDialog類的派生類CDlgInput,并為其中的EditBox控件(其ID為IDC_EDIT1)添加相關(guān)聯(lián)的成員變量m_input,其類型為Cstring。1.創(chuàng)建工程2.添加資源創(chuàng)建一個MFCAppWizard(exe)工程文件Mysdi,并選擇SingleDocument的的應(yīng)用程序。2023/4/1230為CMysdiDoc類添加成員變量可有兩種做法用可視化編程工具,步驟如下:在Workspace窗口的ClassView選項卡中展開MysdiClass,右擊CMysdiDoc;在彈出菜單中,單擊AddMemberVariable;輸入變量類型為CString,變量名m_str,訪問類型public:單擊OK。手工添加成員變量,步驟如下:在Workspace窗口FileView選項卡中展開Mysdifiles|HeaderFiles,雙擊MysdiDoc.h,打開文件;在CMysdiDoc的定義中,找到下面的程序代碼段;//Attributespublic:在此之后手工添加成員變量:CStringm_str;注:在類CMysdiDoc的定義中包括多個public塊,以了區(qū)別開不同用途員。事實上,可都放到同一塊中。3.添加成員變量2023/4/12314.文檔變量初始化在CMysdiDoc的OnNewDocument成員變量中為公有成員m_str賦以初值“您好,單文檔界面的例程!”。方法是將OnNewDocument的實現(xiàn)替換為如下代碼:BOOLCMymdiDoc2::OnNewDocument(){if(!CDocument::OnNewDocument())returnFALSE;m_str="您好,單文檔界面的例程!";returnTRUE;}2023/4/12325.視圖的輸出為視圖的框架窗口中顯示文檔類的m_str成員變量的內(nèi)容,用如下代碼替換類CMysdiView的OnDraw成員函數(shù)voidCMysdiView::OnDraw(CDC*pDC){CMysdiDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRectrectClient; GetClientRect(rectClient); //取當前客戶區(qū)的指針
CSizesizeClient=rectClient.Size(); //取當前客戶區(qū)的大小
CStringstr=pDoc->m_str; //從文件中讀取數(shù)據(jù)
CSizesizeTextExtent=pDC->GetTextExtent(str);//用新字體繪制字符
pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2, (sizeClient.cy-sizeTextExtent.cy)/2,str);}2023/4/12336.文檔串行化在“編輯”菜單中添加一項改變文檔內(nèi)容的菜單,可將所修改的文檔顯示文本存入磁盤文件,實現(xiàn)方法如下:(1)單擊Workspace窗口-->ResourceView選項卡-->展開Mysdiresources|Menu-->雙擊IDR_MAINFRAME-->為“編輯”菜單添加一個菜單項“改變顯示文本”
-->設(shè)置ID為ID_EDIT_CHANGETEXT。(2)為示例程序添加如圖16-7所示的對話框。然后,使用ClassWizard為對話框生成CDialog類的派生類CInputDlg,并為其中的EditBox控件(其ID為IDC_EDIT1)添加相關(guān)聯(lián)的成員變量m_input,其類型為CString。2023/4/12346.文檔串行化(3)在類CMysdiDoc中為菜單項“編輯|改變顯示文本”
(ID為ID_EDIT_CHANGETEXT)添加處理函數(shù)OnEditChangeText()voidCMysdiDoc::OnEditChangetext()
{CInputDlginputDlg;//建立一個CinputDlg類的對象inputDlg//使inputDlg成為一個模式對話框
if(inputDlg.DoModal()==IDOK){m_str=inputDlg.m_input; //獲取輸入的字符串
UpdateAllViews(NULL); //更新視圖
}}2023/4/1235為使CInputDlg類在CMysdiDoc類中成為可識別的,必須在mysdiDoc.cpp文件中加入CInputDlg類的說明頭文件InputDlg.h#include“InputDlg.h”
//加入頭文件為將這些修改存入磁盤文件,并在需要時可打開該文件讀取文檔,重載CExampleDoc類的Serialize()函數(shù)來完成串行化。重載的Serialize()的代碼如下:voidCMysdiDoc::Serialize(CArchive&ar){if(ar.IsStoring())ar<<m_str;//保存文檔內(nèi)容
elsear>>m_str; //讀取文檔內(nèi)容}2023/4/1236§16.6.
編寫多文檔應(yīng)用程序2023/4/1237[例16-2]創(chuàng)建一個標題為“
MyMDITest–Mymdi1”多文檔的應(yīng)用程序,程序運行后,可以打開若干個文檔,如圖所示,Mymdi1和Mymdi21是兩個文檔.2023/4/1238創(chuàng)建一個MFCAppWizard(exe)工程文件Mymdi,并選擇MultipleDocument的的應(yīng)用程序。在Step4單擊Advanced,并設(shè)置AdvancedOption對話框。在Step6設(shè)置基類為CEditView。其它均取默認值設(shè)置。1.創(chuàng)建MDI工程2023/4/12392.創(chuàng)建第二種文檔和視圖類在View-->ClassWizard--classInfo-->AddClass加入新類在NewClass對話框設(shè)置Cdocument的派生類CMymdiDoc2。同樣方法,加入CScollView的派生類CMymdiView2。2023/4/12403.創(chuàng)建資源(1)文檔、視圖、框架窗口共同的資源ID在Resource.h文件中,手工加入下列代碼:#defineIDR_MYMDITYPE2 135這樣,就定義了文檔、視圖、框架窗口共同的資源ID。2023/4/1241(2)文檔模板的資源對于第一個文檔,利用應(yīng)用程序向?qū)е苯赢a(chǎn)生了一個文檔模板,現(xiàn)在必須手工地運用這種格式加入資源。具體的方法是在mymdi.rc文件中,加入下列代碼:IDR_MYMDITYPE2“\nMymdi2\nMymdi2\nMymdi2文件(*.mm2)\n.mm2 \nMymdi2.Document\nMymdi2Document"為了使Windows能夠識別.mm2的文件,在mymdi.reg文件中,加入下列代碼:HKEY_CLASSES_ROOT\.mm2=Mymdi2.DocumentHKEY_CLASSES_ROOT\Mymdi2.Document\shell\open\command=MYMDI.EXE%1HKEY_CLASSES_ROOT\Mymdi2.Document\shell\open\ddeexec=[open("%1")]HKEY_CLASSES_ROOT\Mymdi2.Document\shell\open\ddeexec\application=MYMDI這樣,就在Windows的注冊表中進行了注冊。2023/4/1242(3)菜單、對話框資源為了實現(xiàn)可視化的程序,須添加一系列的資源,用戶可將所修改文檔顯示文本保存入磁盤文件,需要時再打開并恢復(fù)該文檔。(a)單擊Workspace窗口的ResourceView選項卡,展開Mymdiresources|Menu,加入ID為IDR_MYMDITYPE2的菜單,使它與現(xiàn)有的ID為IDR_MYMDITYPE的菜單完全相同,然后,在其“編輯”菜單添加菜單項“改變顯示文本”,并添加新菜單項ID為ID_EDIT_CHANGETEXT。(b)用與16-1例完全相同的方法,添加的對話框。使用ClassWizard為對話框生成CDialog類的派生類CDlgInput,并為其中的EditBox控件(其ID為IDC_EDIT1)添加相關(guān)聯(lián)的成員變量m_input,其類型為CString。2023/4/12434.代碼編輯1.創(chuàng)建文檔模板類在應(yīng)用程序的InitInstance()函數(shù)中,通過使用文檔模板的構(gòu)造函數(shù)創(chuàng)建文檔模板的對象如下:BOOLCMymdiApp::InitInstance(){…
CMultiDocTemplate*pDocTemplate2;pDocTemplate2=newCMultiDocTemplate(IDR_MYMDITYPE2,RUNTIME_CLASS(CMymdiDoc2),//MDI派生文檔類的CRuntimeClass對象的指針
RUNTIME_CLASS(CChildFrame),//MDI派生子框架類的CRuntimeClass對象的指針
RUNTIME_CLASS(CMymdiView2)//創(chuàng)建文檔模板的對象
);//使用CwinApp::AddDocTemplate()將新模板添加到應(yīng)用程序的文檔模板列表中
AddDocTemplate(pDocTemplate2);
…}文檔模板的構(gòu)造函數(shù)2023/4/1244為使CMymdiDoc2類和CMymdiView2類在CMymdiApp類中成為可識別的,必須在MymdiApp.cpp文件中加入說明CMymdiDoc2類和CMymdiView2類的MymdiDoc2.h和MymdiView2.h#include"MymdiDoc2.h" //加入頭文件#include"MymdiView2.h"2.擴展CMymdiDoc2類(a)添加成員變量用對CMysdiDoc類同樣的方法,對CmymdiDoc2類添加成員變量,最終,在CMymdiDoc2.h的下述代碼段中增加變量m_str聲明語句。//Attributespublic:CStringm_str;2023/4/1245(b)文檔變量初始化在CmymdiDoc2的OnNewDocument成員變量中為公有成員m_str賦以初值“您好,多文檔界面的例程!”。方法是將OnNewDocument()代碼替換如下:BOOLCMymdiDoc2::OnNewDocument(){if(!CDocument::OnNewDocument())returnFALSE;m_str="您好,多文檔界面的例程!";returnTRUE;}2023/4/1246(c)添加菜單處理函數(shù)使用ClassWizard在類CmymdiDoc2中為菜單項“編輯|改變顯示文本”
(ID為ID_EDIT_CHANGETEXT)添加處理函數(shù)OnEditChangeText,其代碼如下:voidCmymdiDoc2::OnEditChangetext()
{CDlgInputinputDlg; //建立CinputDlg類的對象inputDlgif(inputDlg.DoModal()==IDOK)//inputDlg成為一個模式對話框
{ m_str=inputDlg.m_input;//獲取輸入的字符串
UpdateAllViews(NULL); //更新視圖
}}為了在CMymdiDoc類中識別CinputDlg類,必須在文件MymdiDoc2.cpp中加入說明CinputDlg類的頭文件。#include"InputDlg.h"
//加入頭文件2023/4/1247(d)文檔串行化為實現(xiàn)Mymdi完成保存及打開文檔的。先在“編輯”菜單中添加一條改變文檔的顯示文件的內(nèi)容,用戶可將對文檔顯示文本所做的修改存入磁盤文件中,需要時,再打開并恢復(fù)該文檔。為了存入磁盤文件中,并在
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZZB Q071-2024 酶底物法微生物智能培養(yǎng)計數(shù)一體機
- T-ZJHIA 16-2024 特殊醫(yī)學(xué)用途配方食品臨床營養(yǎng)治療營養(yǎng)篩查數(shù)據(jù)集
- 二零二五年度離婚協(xié)議中夫妻共同財產(chǎn)清算補充協(xié)議
- 二零二五年度直播帶貨主播合作權(quán)益保障合同
- 2025年度智能制造合作伙伴協(xié)議書
- 二零二五年度木制家具生產(chǎn)廠木工用工協(xié)議書
- 二零二五年度車輛掛靠運輸合同車輛運輸合同安全保障協(xié)議
- 二零二五年度個人租賃帶太陽能熱水系統(tǒng)住宅合同
- 二零二五年度餐飲行業(yè)知識產(chǎn)權(quán)保護協(xié)議
- 二零二五年度兼職攝影師聘用合同模板
- 家校共育之道
- DeepSeek入門寶典培訓(xùn)課件
- 西安2025年陜西西安音樂學(xué)院專職輔導(dǎo)員招聘2人筆試歷年參考題庫附帶答案詳解
- 《作文中間技巧》課件
- 廣東省2025年中考物理仿真模擬卷(深圳)附答案
- 2025屆八省聯(lián)考 新高考適應(yīng)性聯(lián)考英語試題(原卷版)
- 新蘇教版一年級下冊數(shù)學(xué)第1單元第3課時《8、7加幾》作業(yè)
- 2024年山東電力高等??茖W(xué)校高職單招職業(yè)技能測驗歷年參考題庫(頻考版)含答案解析
- 2024年電力交易員(高級工)職業(yè)鑒定理論考試題庫(單選題、多選題、判斷題)
- 《平面廣告賞析》課件
- 【公開課】同一直線上二力的合成+課件+2024-2025學(xué)年+人教版(2024)初中物理八年級下冊+
評論
0/150
提交評論