版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、文檔視結(jié)構(gòu)第11章本章主要內(nèi)容11.2 切分視圖11.1 文檔/視圖結(jié)構(gòu)11.3 文檔序列化11.1.1 文檔、視圖、框架基本概念單文檔程序的流程單文檔模板字符串多文檔程序結(jié)構(gòu)1、基本概念MFC程序中將數(shù)據(jù)的維護與顯示分離,分別由緊密相關(guān)的兩個類對象負責(zé)文檔類對象:相當(dāng)于一個數(shù)據(jù)容器或數(shù)據(jù)管理中心,用于管理數(shù)據(jù)。文檔基類為CDocument視圖類對象:顯示數(shù)據(jù)的窗口,視同時負責(zé)與用戶的交互,將用戶對數(shù)據(jù)的改變寫入文檔中,當(dāng)文檔中的數(shù)據(jù)發(fā)生變化時,由視中的OnDraw負責(zé)顯示的更新。視圖基類為CView。文檔和視圖的關(guān)系是“一對多”,一個文檔可以有多個視圖對應(yīng)。基本概念主框架窗口主框架窗口是頂層
2、窗口,帶有邊框、標(biāo)題欄、菜單等;工具欄、狀態(tài)欄、視圖窗口是它的子窗口。單文檔主框架窗口基類為CFrameWnd。文檔模板:總管文檔/視/框架是捆綁在一起的三個有機對象,MFC通過文檔模板來管理它們應(yīng)用程序:在應(yīng)用程序中定義一個文檔模板對象,建立和關(guān)聯(lián)文檔/視/框架的關(guān)聯(lián)?;靖拍罡魉酒渎毻ǔ?shù)據(jù)保存在文檔中,當(dāng)文檔數(shù)據(jù)發(fā)生變化后,通知所有視圖更新;視圖中通過OnDraw顯示文檔數(shù)據(jù),因為視圖作為覆蓋了主框架窗口的客戶區(qū),負責(zé)與用戶的交互(如鼠標(biāo)、鍵盤操作常映射到視圖類),并將數(shù)據(jù)存入文檔;框架負責(zé)各種子窗口的管理。2、單文檔程序流程應(yīng)用程序類的InitInstance方法中部分代碼 CSin
3、gleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CDrawDoc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CDrawView);AddDocTemplate(pDocTemplate);單文檔程序的執(zhí)行過程創(chuàng)建應(yīng)用程序類對象InitInstance;創(chuàng)建SDI文檔模板對象;構(gòu)造文檔類對象,不讀取數(shù)據(jù)構(gòu)造主框架類對象,創(chuàng)建主窗口,不顯示有主框架構(gòu)造視圖對象,創(chuàng)建視圖窗口,但不顯示建立視圖、框架、文檔對象間的
4、聯(lián)系調(diào)用文檔的OnNewDocument調(diào)用視圖的OnInitialUpdate調(diào)用框架的ActiveFrame,顯示窗口、子窗口3、單文檔文檔模板字符串雙擊文檔模板字符串含義窗口標(biāo)題文檔根名稱,默認為“無標(biāo)題”新建文檔類型名文件過濾器正文文檔擴展名示例:修改文檔模板字符串通過修改文檔模板字符串,使得打開或保存文檔時,過濾cpp文檔。效果圖4、多文檔程序結(jié)構(gòu)主框架類CMaiFrame基類CMDIFrameWnd,僅有一個,擁有菜單和工具欄等,不包含視圖對象,可以包含多個子框架窗口,在InitInstance中創(chuàng)建。子框架類CChildFrame基類CMDIChildWnd,多個(每個子窗口一個
5、),沒有菜單和工具欄,每個子框架包含一個視圖對象,創(chuàng)建新子窗口時創(chuàng)建每次創(chuàng)建或打開新文檔時,創(chuàng)建子框架窗口、文檔、視圖對象。多文檔程序流程 CMultiDocTemplate* pDocTemplate;pDocTemplate = new CMultiDocTemplate(IDR_SIMPLETYPE,RUNTIME_CLASS(CSimpleDoc),RUNTIME_CLASS(CChildFrame), RUNTIME_CLASS(CSimpleView);AddDocTemplate(pDocTemplate);CMainFrame* pMainFrame = new CMainFr
6、ame;if (!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;m_pMainWnd = pMainFrame;MDI關(guān)聯(lián)文檔/視/子框架窗口多文檔程序的執(zhí)行過程創(chuàng)建應(yīng)用程序類對象InitInstance創(chuàng)建MDI文檔模板對象;構(gòu)造主框架類對象,創(chuàng)建主窗口,但不顯示間接調(diào)用OnFileNew,先構(gòu)造文檔對象構(gòu)造子框架窗口對象,創(chuàng)建主框架窗口構(gòu)造視圖對象,創(chuàng)建視圖窗口每次打開或新建文檔,均執(zhí)行相似的過程,每個文檔對應(yīng)一套文檔/視/子框架窗口。單文檔與多文檔比較單文檔主框架窗口包含視圖,程序中只有一套文檔/視/框架;每次新建或打開文檔時不重新創(chuàng)建文
7、檔、視圖、框架對象,只是更新內(nèi)容而已;多文檔主框架窗口包含子框架窗口作為子窗口,子框架窗口含視圖,程序中可以有多套文檔/視/子框架窗口;每新建一個文件或打開文件,都要創(chuàng)建各自的文檔、視和子框架窗口。多文檔文檔模板字符串由兩個字符串構(gòu)成IDR_MAINFRAME:對應(yīng)單文檔文檔模板字符串資源的第一項,對應(yīng)應(yīng)用程序標(biāo)題。IDR_SIMPLETYPE對應(yīng)單文檔文檔模板字符串資源的后六項。 11.1.2 相互作用文檔視圖相互作用文檔類的幾個重要成員函數(shù)視圖與框架窗口作用控制框架窗口顯示1、文檔視圖相互作用視圖類中獲得文檔類對象指針GetDocument,得到文檔對象指針后,可以訪問其中的公有成員。文檔
8、類中UpdateAllViews:更新與文檔關(guān)聯(lián)的視圖窗口,第一個參數(shù)為NULL表示更新所有視圖,如為某個窗口指針,更新該窗口以外的所有視圖當(dāng)文檔類數(shù)據(jù)發(fā)生變化時,應(yīng)調(diào)用該函數(shù)更新相關(guān)的視圖。文檔視圖相互作用視圖類的OnUpdate是視圖的虛函數(shù),每當(dāng)文檔類調(diào)用了UpdateAllViews后,會調(diào)用被更新視圖類的OnUpdate函數(shù),該函數(shù)默認調(diào)用Invalidate刷新整個客戶區(qū)。void UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL );void OnUpdate( CView* pSen
9、der, LPARAM lHint, CObject* pHint );文檔視圖相互作用視圖類的OnInitialUpdate應(yīng)用程序被啟動時,或“文件”菜單中選擇了“新建”或“打開”時,該虛函數(shù)會被自動調(diào)用。該函數(shù)默認會調(diào)用無參數(shù)的OnUpdate函數(shù)。用戶可以重載此函數(shù)以初始化視圖顯示;如果采用SCrollView作為視圖類,應(yīng)該在該函數(shù)中設(shè)置映射模式。2、文檔的幾個成員文檔類的OnNewDocument在文檔應(yīng)用程序中,點擊“文件”菜單中的“新建”命令時,或者首次創(chuàng)建文檔對象時,會調(diào)用該虛函數(shù)。對于單文檔應(yīng)用程序,必須在該虛函數(shù)中對新建文檔數(shù)據(jù)的初始化,而不應(yīng)該將初始化工作放在構(gòu)造函數(shù)中
10、。文檔的幾個成員文檔類的OnOpenDocument在文檔應(yīng)用程序中,點擊“文件”菜單中的“打開”命令時,會調(diào)用該虛函數(shù)。默認會調(diào)用DeleteContents清空文檔對象,然后調(diào)用Serialize完成文檔序列化。對于單文檔的打開文檔的初始化操作,要放在該函數(shù)中,而不能放在構(gòu)造函數(shù)中。 文檔的幾個成員文檔類的OnDeleteContents點擊“文件”“打開”或“新建”菜單時,OnOpenDocument和OnNewDocument會調(diào)用該函數(shù),以清空文檔。當(dāng)關(guān)閉文檔時,也會調(diào)用該函數(shù)。對于單文檔應(yīng)用程序,由于重用同一個文檔對象,應(yīng)該重載該函數(shù),完成文檔清理工作。 文檔的幾個成員文檔類的Se
11、tModifiedFlag和IsModified文檔類有一個BOO型的標(biāo)志變量,用于標(biāo)識文檔數(shù)據(jù)是否已經(jīng)被修改,當(dāng)該標(biāo)識為true時,標(biāo)識數(shù)據(jù)已經(jīng)被修改。關(guān)閉主框架窗口時,會根據(jù)該標(biāo)識提示用戶保存數(shù)據(jù)修改。當(dāng)更新數(shù)據(jù)后,應(yīng)調(diào)用SetModifiedFlag(true)將更新標(biāo)志設(shè)置為true;IsModified函數(shù)用于返回該標(biāo)志變量。文檔的幾個成員如果一個文檔對應(yīng)多個視圖GetFirstViewPosition函數(shù)獲得與文檔類相關(guān)聯(lián)的視圖列表中第一個可見視圖的位置;GetNextView函數(shù)獲取指定視圖位置的視圖類指針,并將此視圖位置移動到下一個位置,若沒有下一個視圖,則視圖位置為NULL。
12、POSITION GetFirstViewPosition( );CView* GetNextView( POSITION& rPosition );3、視圖與框架窗口作用視圖中獲得主框架窗口對象指針GetParentFrame:獲得直接包容視圖的子窗口(對于SDI為主框架窗口,對于MDI即為包容當(dāng)前視圖的子框架窗口)獲得主框架窗口:先獲得應(yīng)用程序?qū)ο螅蓱?yīng)用程序?qū)ο蟮膍_pMainWnd得到主框架窗口。視圖與框架窗口作用MDI主框架窗口類GetActiveFrame:獲得活動子框架窗口,如果為SDI或沒有活動子窗口,返回主窗口本身。MDIGetActive:獲得活動子框架窗口指針,如果沒有活
13、動子窗口,返回NULL視圖與框架窗口作用子框架窗口類GetActiveView:獲得與當(dāng)前子框架窗口連接的活動視圖對象指針(不能在MDI主框架窗口中調(diào)用該函數(shù),返回NULL,因為MDI的主框架窗口無關(guān)聯(lián)的視圖)GetMDIFrame:獲得主框架窗口2個全局函數(shù)AfxGetApp():獲得應(yīng)用程序?qū)ο驛fxGetMainWnd:獲得主框架窗口4、控制主窗口狀態(tài)設(shè)置主窗口風(fēng)格BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)cs.style&=WS_MAXIMIZEBOX;cs.cy=:GetSystemMetrics(SM_CYSCREEN)/3;
14、cs.cx=:GetSystemMetrics(SM_CXSCREEN)/3;cs.y=(cs.cy*3)-cs.cy)/2;cs.x=(cs.cx*3)-cs.cx)/2;return CFrameWnd:PreCreateWindow(cs); /增加風(fēng)格cs.style|=WS_常用的屬性值其它的窗口風(fēng)格WS_MAXIMIZE:最大化WS_MINIMIZE:最小化WS_MINIMIZEBOX:最小化按鈕可用WS_MAXIMIZEBOX:最大化按鈕可用WS_SYSMENU:含系統(tǒng)菜單控制子窗口狀態(tài)控制子窗口風(fēng)格CChildFrame的PreCreateWindow函數(shù)BOOL CChild
15、Frame:PreCreateWindow (CREATESTRUCT& cs)cs.style&=WS_MAXIMIZEBOX;if( !CMDIChildWnd:PreCreateWindow(cs) )return FALSE;return TRUE;InitInstance中控制窗口顯示/ 默認顯示方式為SW_SHOWNORMALm_nCmdShow=SW_SHOWMAXIMIZED;pMainFrame-ShowWindow(m_nCmdShow);pMainFrame-UpdateWindow();/ SW_SHOWMINIMIZED 最小化InitInstance中控制窗口顯示p
16、MainFrame-UpdateWindow();CRect rcWindow;m_pMainWnd-GetWindowRect(rcWindow);m_pMainWnd-MoveWindow(500,100,rcWindow.Width(),rcWindow.Height(),true);/ m_pMainWnd-CenterWindow();CChildFrame *pChild=(CChildFrame *) pMainFrame-MDIGetActive();pChild-CenterWindow();視圖類中控制主、子框架窗口void CDSpliteView:OnLButtonDo
17、wn() CChildFrame *pChild= (CChildFrame *)GetParentFrame(); pChild-CenterWindow(); AfxGetMainWnd()-CenterWindow(); CView:OnLButtonDown(nFlags, point);本章主要內(nèi)容11.2 切分視圖11.1 文檔/視圖結(jié)構(gòu)11.3 文檔序列化1、基礎(chǔ)知識通過CSplitterWnd,可以將“視圖”切分為多個窗格,每個窗格為某種視圖類對象(由CView派生)SDI程序,將CSplitterWnd嵌入主框架類中,MDI程序,將CSplitterWnd嵌入在CMDIChi
18、ldWnd類中動態(tài)分隔:創(chuàng)建的多個窗格都屬于同一個視圖類靜態(tài)分隔:創(chuàng)建的每個窗格對應(yīng)不同視圖類2、動態(tài)切分方法創(chuàng)建工程的第4步動態(tài)切分方法修改子框架類的OnCreateClientBOOL CChildFrame:OnCreateClient( ) return m_wndSplitter.Create( this,2,2,CSize(10,10),pContext);切分為2行2列動態(tài)切分方法若未選中Use split WindowSDI為例,在CMaiFrame中添加成員變量CSplitterWnd m_wndSplitter;映射OnCreateClient函數(shù),創(chuàng)建分隔視窗BOOL C
19、MainFrame:OnCreateClient() return m_wndSplitter.Create( this, 2,2,CSize(10,10),pContext);3、靜態(tài)切分示例任務(wù)將程序視圖切分為兩個部分,左側(cè)用于選擇某種圖形,右側(cè)的視圖窗口用于顯示圖形需要兩個視圖類,以有的程序用CView作為客戶區(qū)窗口,需要添加一個視圖類,本例選用CFormView作為左側(cè)的視圖類CFormView類似對話框,關(guān)聯(lián)一個對話框資源,可以在視中放置控件文檔類中添加成員創(chuàng)建SDI項目向?qū)У?步,選中Use Split window選項文檔類中添加成員變量,在構(gòu)造函數(shù)中初始為0,用于表示用戶選擇何
20、種類型圖形int m_type;/ m_type:0表示畫線,1表示畫矩形,2表示畫圓一檔多視的情況下,往往間數(shù)據(jù)都保存在文檔類中,便于訪問創(chuàng)建對話框資源創(chuàng)建對話框資源(左側(cè)視圖)執(zhí)行InsertResource,選擇Dialog下的IDD_FORMVIEW項,刪除默認的控件,添加如下的控件關(guān)聯(lián)對話框類為對話框資源關(guān)聯(lián)類雙擊對話框資源,基類選擇CFormView,類名稱為CDataView為IDC_RADIO1關(guān)聯(lián)成員變量int m_type構(gòu)造函數(shù)中初始化為0;靜態(tài)切分修改主框架類OnCreateClientBOOL CMainFrame:OnCreateClient(LPCREATESTR
21、UCT lpcs, CCreateContext* pContext) m_wndSplitter.CreateStatic(this,1,2);m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDataView),CSize(0,0),pContext);m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CSSplitView),CSize(0,0),pContext);CDataView是構(gòu)造的視,CSSplitView是默認生成的靜態(tài)切分BOOL CMainFrame:OnCreateClient() CDataV
22、iew *pWnd=(CDataView *)m_wndSplitter.GetPane(0,0);/ 獲得指定窗格對象的指針CSize size=pWnd-GetTotalSize();m_wndSplitter.SetColumnInfo(0,size.cx,0);return true; / 需要包含相應(yīng)的頭文件/在視圖類定義之前,添加class CSSplitDoc;設(shè)置左側(cè)窗口的合理大小映射單選按鈕消息映射3個單選按鈕到OnRadio1()中void CDataView:OnRadio1() CSSplitDoc *pDoc=(CSSplitDoc *)GetDocument();U
23、pdateData();pDoc-m_type=m_type;pDoc-UpdateAllViews(this); /this表明不更新自己OnDrawvoid CSSplitView:OnDraw(CDC* pDC)CSSplitDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);switch(pDoc-m_type)case 0: pDC-MoveTo(50,50); pDC-LineTo(120,120); break;OnDrawvoid CSSplitView:OnDraw(CDC* pDC) case 1: pDC-Rectangle(50,5
24、0,120,120); break;case 2: pDC-Ellipse(50,50,120,120); break;本章主要內(nèi)容11.2 切分視圖11.1 文檔/視圖結(jié)構(gòu)11.3 文檔序列化1、基本概念序列化Serialization,也稱為串行化,向永久存儲介質(zhì)寫入對象或從存儲介質(zhì)載入對象的過程。對象可以將自身的狀態(tài)(數(shù)據(jù)成員)保存到磁盤中,隨時可以從磁盤中讀取對象的狀態(tài)并構(gòu)建該對象。在文檔/視結(jié)構(gòu)程序中,序列化是MFC的基本功能,MFC提供了一套完善的機制。基本概念CFile和CArchive磁盤文件的操作封裝在CFile中,可以在程序中直接使用CFile進行文件操作。為了配合文檔/視結(jié)構(gòu),MFC并不直接使用CFile,而是使用CArchive類。文檔類提供了一個Serialize函數(shù),當(dāng)我們執(zhí)行“保存”或“打開”時,會執(zhí)行Serialize函數(shù),并傳入一個CArchive參數(shù),可以將CArchive理解為CFile的緩沖數(shù)據(jù)對象。CArchive內(nèi)部保持一個標(biāo)記,指明是存儲還是加載操作。文檔類的Ser
溫馨提示
- 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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度廢舊塑料管回收與銷售合作協(xié)議3篇
- 倉儲物流設(shè)施租賃合同
- 企業(yè)數(shù)據(jù)跨境合作框架協(xié)議
- 2024年車間生產(chǎn)外包合同3篇
- 二零二五年度安防監(jiān)控設(shè)備租賃服務(wù)合同2篇
- 2025年度杭州市二手房買賣合同范例6篇
- 二零二五年度房產(chǎn)出售附贈裝修合同3篇
- 二零二五年度文化產(chǎn)業(yè)資產(chǎn)轉(zhuǎn)讓合作協(xié)議3篇
- 2024新能源企業(yè)關(guān)于電動汽車充電設(shè)施建設(shè)的合同
- 2024年設(shè)備租賃使用權(quán)協(xié)議
- 江西省2023-2024學(xué)年高二上學(xué)期期末教學(xué)檢測數(shù)學(xué)試題 附答案
- 焦作市中佰宜佳材料有限公司年產(chǎn)15萬噸煅后焦項目環(huán)評報告
- GB/T 6913-2023鍋爐用水和冷卻水分析方法磷酸鹽的測定
- 項目部布置圖方案
- 珠海某啤酒廠拆除工程施工方案
- 人教PEP版三年級上冊英語 Unit 2 教案 課時一
- 無損檢測-滲透檢測(導(dǎo)學(xué))
- 2022一、二級個人防護(穿脫防護服)操作評分表(精華版)
- 廣東省中醫(yī)院進修申請表
- 竣工之風(fēng)量平衡測試報告air distribution balance report
- 貝利嬰幼兒發(fā)展量表(BSID)
評論
0/150
提交評論