在VC++ 中 使用MFC實現(xiàn)MDI界面_第1頁
在VC++ 中 使用MFC實現(xiàn)MDI界面_第2頁
在VC++ 中 使用MFC實現(xiàn)MDI界面_第3頁
在VC++ 中 使用MFC實現(xiàn)MDI界面_第4頁
在VC++ 中 使用MFC實現(xiàn)MDI界面_第5頁
全文預覽已結(jié)束

下載本文檔

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

文檔簡介

1、在VC+中 使用MFC實現(xiàn)MDI界面MDI (Multiple Document Interface)是 Windows 界面 的 一種規(guī) 范, 它建立多個窗口來瀏覽文檔數(shù)據(jù),如Windows中的Program Manager等都是按MDI規(guī)范實現(xiàn)的。在實際工程軟件開發(fā)中, 許多程序員將其作為一種實現(xiàn)多窗口的標準方法。微軟 基礎類庫(Microsoft Foundation Class Library,簡稱 MFC 庫),是微軟 公司為方便Windows程序開發(fā)所提供的一個功能強大的 通用類庫MFC的核心是以類的形式封裝了大量Windows APIO 在可視化編程語言VC+下應用MFC是目前開

2、發(fā)Windows程序 最方便的途徑之一。VC+提供的各種開發(fā)工具如AppWizard、 ClassWizard和App Studio,可以建 立起具 備基本 功能的Windows 框架程序(Framework)。而程序員所需要做的工作就是將自 己特有的代碼填入到框架程序中去,從而極大地減少了 用戶界面編程的工作量,加快了開發(fā)速度。關(guān)于MDI的標 準開發(fā)方法可參考一般的Windows編程書籍,本文將介紹 利用MFC實現(xiàn)MDI界面。MFC 2.0以上版本支持“文檔/瀏覽視窗”(Document/View) 結(jié)構(gòu)模式。由文檔負責管理數(shù)據(jù),瀏覽視窗負責數(shù)據(jù)顯 示及與用戶的交互,從而實現(xiàn)了數(shù)據(jù)與界面的分

3、離,使 整個程序設計更具規(guī)范化、模塊化。MFC中,“文檔”由類 CDocument及其派生類實現(xiàn)(簡稱Doc類);“瀏覽視窗”由類 CView及其派生類實現(xiàn)(簡稱View類)。二者都包含于應用 程序的框架窗口中,并由其管理。使用單文檔時,框架窗 口由類CFrameWnd及其派生類實現(xiàn);使用多文檔時,框架窗 口是利用類CMDIFrameWnd和CMDIChildWnd實現(xiàn)。由文檔模板將 文檔、瀏覽窗口和框架窗口三者聯(lián)系起來。當程序員在App Wizard的Option選項中選擇Multiple Document Interface時,MFC構(gòu)架程序(Framework)將自動生成實現(xiàn) MDI基本

4、功能的代碼。類CMDIFrameWnd負責整個應用程序的 主框架窗口;類CMDIChildWnd實現(xiàn)MDI的子窗口框架,它不帶 菜單項,而與主框架窗口共享菜單。主框架窗口依據(jù)當 前激活的子窗口自動更換菜單項。CView則負責MDI子窗口 客戶區(qū)中顯示的具體內(nèi)容。例如, App Wizard的以M01為Project 名建立的構(gòu)架程序(framework)中包括一些基本類:主框架 窗 口 CMainFrame: 派生 自 CMDIFrameWnd; 文 檔 CM01Doc : 派生 自 CDocument;瀏 覽 窗 口 CM01View:派 生 自 CView;其 中 CM01Doc、CM01

5、View 和CMDIChildWnd由多文檔模板CMultiDocTemplate聯(lián)系在一起。在 CM01App:InitInstance()函數(shù)中代碼如下:BOOL CM01App:InitInstance()CMultiDocTemplate* pDocTemplate;/ CMultiDocTemplate 用 于 MDI 文 檔 pDocTemplate = new CMultiDocTemplate( IDR_M01TYPE,/ 資源標識 RUNTIME_CLASS(CM01Doc),/文檔類RUNTIME_CLASS(CMDIChildWnd),/標準MDI子窗口框架 RUNTIM

6、E_CLASS(CM01View);/瀏覽視窗類AddDocTemplate(pDocTemplate);/為整個應用程序添加新模板此時,數(shù)據(jù)Doc類僅與一種View類相關(guān)聯(lián),MDI每個子窗 口顯示的內(nèi)容是一致的。如果用戶希望不同的子窗口顯 示不同的文檔,則需要分別建立新的資源項、新的文檔 類、新的View類,并且用新模板將他們與CMDIChildWnd聯(lián)系起 來即可OMFC框架程序?qū)碗s的消息發(fā)送和接收機制隱藏 起來,自動實現(xiàn)子窗口的調(diào)度安排。程序員只需設定自 己的數(shù)據(jù),并在各個View中重載OnDraw()函數(shù),完成所需的 繪制。然而在實際開發(fā)應用程序中,常常希望對某一類數(shù) 據(jù)進行不同方式

7、的顯示,既可觀察數(shù)值,又可有圖形顯 示。這就要求同一種Doc類與多個View類相關(guān)聯(lián),而每個 View類對應一個不同的MDI子窗口。CMultiDocTemplate的典型 用法是建立獨立的文檔結(jié)構(gòu)和View對象。而下面 CMultiDocTemplate將使用同一文檔和多個View類。用 ClassWizard 建立一新的 View 類:CM02Viewo建立新模板:CMultiDocTemplate* pDocTemplate02二new CMultiDocTemplate(IDR_M01TYPE, /使用同一資源RUNTIME_CLASS(CM01Doc), / 同一文檔RUNTIME_

8、CLASS(CMDIChildWnd), / 標準 MDI 子窗 口框架RUNTIME_CLASS(CM02View); / 新 View然后使用CApp:AddDocTemplate函數(shù)添加新模板。如果此時仍然在CM01App:InitInstance()函數(shù)中添加新 模板,則構(gòu)架程序會錯誤地認為程序支持兩種文檔類型, 從而在編譯產(chǎn)生的EXE文件執(zhí)行時彈出對話框,要求用 戶選擇文檔類型。而實際上兩種文檔類型是一樣的。為避免此種情況,可使用MFC開發(fā)者建議的方法:在 前 例情 況下,首先,應 在App Studio中將 字串資 源IDR_M01TYPE 復制為一個新字串資源IDR_M02TYP

9、E。然后,刪去字串資源 IDR_M02TYPE中第二個n后的字符串M01 Document(該字串即為 CDocTemplate:fileNewName 項)。之后,用新資源 IDR_M02TYPE 來建 立第二個模板。這樣編譯的EXE文件將不會彈出對話框。 在研究MFC的源碼之后,發(fā)現(xiàn)之所以彈出文檔類型對話 框,是 由 于 CM01App:InitInstance()函數(shù) 中調(diào)用 了 OnFileNew()函 數(shù)oQnFileNew()函數(shù)檢查文檔模板數(shù)量;當不止一個模板時, 則彈出對話框;待用戶選擇之后,按所選的文檔類型建 立MDI窗口。由于刪去了第二個模板的fileNewName項,無法

10、 顯示文檔類型,就自動停止對話框,而將第一種類型作 為缺省文檔類型建立MDI窗口。在工程應用程序中,OnFileNew()函數(shù)一般只在程序初 始化時調(diào)用一次(至于菜單File I New的響應,用戶可接管 處理),所以可以不在CMyApp:InitInstance()函數(shù)中添加新文 檔模板,躲過OnFileNew()函數(shù)的檢查,而在需要的時候添加所需的文檔模板,建立新的子窗口。這樣既避免了文檔類型對話框,又不必增加字串資源。一種簡單的例子如下:第一個子窗口仍由構(gòu)架程序自動建立;設定一個新的菜單項“新窗口(NewWindow)”,在CMainFrame 中處理該菜單消息,消息響應函數(shù)中顯示第二個

11、子窗口。void CMainFrame:OnNewWindow()(/添加新的文檔模板static CMultiDocTemplate* pDocTemplate_New;static BOOL bChildCreated二FALSE;/標志,新窗口是否建立;如已建,將不重建if(bChildCreated=FALSE)(pDocTemplate_New = new CMultiDocTemplate(IDR_M01TYPE, /使用同一資源RUNTIME_CLASS(CM01Doc),RUNTIME_CLASS(CMDIChildWnd),/標準MDI子窗口框架RUNTIME_CLASS(C

12、M02View);AfxGetApp()-AddDocTemplate(pdocTemplate_New);/創(chuàng)建新的子窗口CMDIChildWnd* pMDIActive = MDIGetActive(); / 獲 得當前 活動子 窗口的指針CMpvDoc* pDoc = (CMpvDoc*)pMDIActive-GetActiveDocument(); / 獲 得文檔指針CMDIChildWnd* pNewFrame=(CMDIChildWnd*) (pDocTemplate_New -CreateNewFrame(pDoc, NULL);/建立新的框架窗口if (pNewFrame = NULL)(AfxMessageBox(新窗口 不能建立,MB_OK,0);return; / not createdpDocTemplate_New -InitialUpdateFrame(pNewFrame, pDoc); / 顯 示 窗口MDITile(MDITILE_HORIZONTAL); / 將 多個窗 口平鋪bChildCreated二TRUE;不同的View在OnDraw()函數(shù)中

溫馨提示

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

評論

0/150

提交評論