vc第11章 單文檔多文檔_第1頁
vc第11章 單文檔多文檔_第2頁
vc第11章 單文檔多文檔_第3頁
vc第11章 單文檔多文檔_第4頁
vc第11章 單文檔多文檔_第5頁
已閱讀5頁,還剩53頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

VisualC++第十一章

單文檔與多文檔11.1概述MFCAppWizard支持的應(yīng)用程序類型1.單文檔界面(SDI)

——只有一個(gè)窗口每一個(gè)文檔可以有多個(gè)視圖每個(gè)視圖只能對(duì)應(yīng)于一個(gè)確定的文檔2.多文檔界面(MDI)——有多個(gè)子窗口,同時(shí)對(duì)多個(gè)文檔進(jìn)行操作解決多個(gè)文檔的數(shù)據(jù)管理方法每次打開一個(gè)新文檔派生的新的MDI子窗口3.基于對(duì)話框的應(yīng)用程序SDI文檔/視圖應(yīng)用程序示意圖

文檔/視圖結(jié)構(gòu)基本思想:數(shù)據(jù)管理和顯示分開文檔負(fù)責(zé)數(shù)據(jù)管理和維護(hù),數(shù)據(jù)保存在文檔類的成員變量中磁盤文件中讀取、保存數(shù)據(jù)處理菜單、工具欄按鈕和加速鍵的WM_COMMAND消息(命令消息),但不處理其它Windows消息。視圖在文檔和用戶之間起中介作用接收用戶的輸入,并接受用戶的修改直接或間接的訪問文檔類中的成員變量,從文檔類中(不是從存儲(chǔ)介質(zhì)中)取數(shù)據(jù)并顯示通過調(diào)用文檔和視圖的接口將修改的信息反饋給文檔類,實(shí)際的數(shù)據(jù)更新仍然是由文檔來完成的。命令消息(WM_COMMAND)產(chǎn)生選擇菜單項(xiàng)單擊快捷鍵工具條按鈕處理框架窗口(大多數(shù)命令)視圖、文檔、文檔模板、

應(yīng)用程序類也可以處理注意窗口消息和控件通知消息

只能由窗口和視圖處理。文檔/視圖結(jié)構(gòu)程序基本結(jié)構(gòu):應(yīng)用程序?qū)ο螅–WinApp)框架窗口對(duì)象(CFrameWnd)文檔對(duì)象(CDocument)視圖對(duì)象(CView)文檔模板對(duì)象(CDocTemplate)文檔/視圖結(jié)構(gòu)1、應(yīng)用程序?qū)ο?--CWinApp的派生類(1)管理應(yīng)用程序的初始化;(2)保持文檔、視圖和框架窗口之間的關(guān)系;(3)接收Windows消息,進(jìn)行消息的調(diào)度;2、框架窗口對(duì)象---CFrameWnd的派生類(1)提供應(yīng)用程序主窗口;(2)工具欄、狀態(tài)欄的創(chuàng)建、初始化和銷毀;文檔/視圖結(jié)構(gòu)3、文檔對(duì)象:CDocument的派生類(1)管理和維護(hù)數(shù)據(jù),串行化功能;(2)處理WM_COMMAND消息;4、視圖對(duì)象:CView的派生類(1)文檔和用戶的中介;(2)讀取文檔中的數(shù)據(jù),顯示到屏幕上;視圖通過GetDocument成員函數(shù)獲得指向相關(guān)聯(lián)的文檔對(duì)象的指針通過該指針調(diào)用文檔類的成員函數(shù)來從文檔中讀取數(shù)據(jù)視圖把數(shù)據(jù)顯示于計(jì)算機(jī)屏幕上用戶通過與視圖的交互來查看數(shù)據(jù)并對(duì)數(shù)據(jù)進(jìn)行修改視圖通過相關(guān)聯(lián)的文檔類的成員函數(shù)將經(jīng)過修改的數(shù)據(jù)傳遞給文檔對(duì)象文檔對(duì)象獲得修改過的數(shù)據(jù)之后,對(duì)其進(jìn)行必要的修改,最后保存到永久介質(zhì)(如磁盤文件)中文檔/視圖結(jié)構(gòu)的工作機(jī)制11.2.Doc/View框架的主要成員(1)CWinApp(2)CFrameWnd(3)Cdocument(4)CView10(1)CWinAppCWinApp類代表主程序,負(fù)責(zé)維護(hù)進(jìn)程的啟動(dòng)、終止、消息循環(huán)、命令行參數(shù)、資源管理??梢哉{(diào)用AfxGetApp獲取CWinApp類型指針。成員 描述m_pszAppName 應(yīng)用程序名m_lpCmdLine 命令行參數(shù)m_pMainWnd 應(yīng)用程序主窗口指針m_pszExeName 可執(zhí)行文件名m_pszProfileName 配置INI文件名InitInstance MFC程序的入口ExitInstance MFC程序的出口(2)CFrameWnd框架窗口維護(hù)了很多幕后的工作,例如工具條、菜單、狀態(tài)條的顯示、更新,視圖的位置和顯示,其它可??靠丶耐?亢蛣?dòng)態(tài)尺寸調(diào)整。許多默認(rèn)為MFC應(yīng)用程序應(yīng)該具備的基本功能都是CFrameWnd類在完成。(3)CDocument視圖操作voidAddView(CView*pView);voidRemoveView(CView*pView);voidUpdateAllView(CView*pSender, LPARAMlHint=0L, CObject*pHint=NULL);CDocument——視圖管理視圖遍歷用戶可通過函數(shù)GetFirstViewPosition()和GetNextView()得到和文檔關(guān)聯(lián)的視圖的指針。POSITIONGetFirstViewPosition()const;CView*GetNextView(POSITION&rPosition);CDocument——視圖管理視圖遍歷//得到視圖列表頭的位置POSITIONpos=GetFirstViewPosition();while(pos!=NULL){//獲得視圖指針CView*pView=GetNextView(pos); …}CDocument——文檔串行化串行化:將對(duì)象寫入字節(jié)流和從字節(jié)流恢復(fù)對(duì)象的操作。串行化除了可以使用文件保存對(duì)象之外,還可以通過網(wǎng)絡(luò)、串口傳輸對(duì)象,因此使用字節(jié)流。

串行化處理通常是通過CArchive類來完成的。CDocument——文檔串行化CArchive類的常用成員WriteString 寫入字符串ReadString 讀取字符串ReadClass 讀取類信息WriteClass 寫入類信息Read 讀取字節(jié)內(nèi)容Write 寫入字節(jié)內(nèi)容CDocument——文檔串行化CArchive類的常用成員operator<< 將基本類型寫入流中operator>> 從流中讀取基本類型ReadObject 讀取串行化對(duì)象WriteObject 寫入串行化對(duì)象Flush 將緩沖區(qū)中的數(shù)據(jù)強(qiáng)制寫入流中(4)CView視圖類(CView)是從CWnd類下派生的,視圖類具有CWnd的所有功能如:創(chuàng)建、移動(dòng)、顯示和隱藏窗口等。CView類可以接收任何Windows消息,而CDocument類則不行。CView——常用方法OnDraw由MFC調(diào)用發(fā)出文檔到設(shè)備描述表在屏幕發(fā)生變化或因?yàn)榻裹c(diǎn)的變化需要重繪時(shí)調(diào)用,沒有該函數(shù),就不可能在程序的切換后保證屏幕的正確顯示。若想在數(shù)據(jù)更新的時(shí)強(qiáng)制視圖更新,可調(diào)用Invalidate方法和UpdateWindow方法來實(shí)現(xiàn)。CView——常用方法OnInitialUpdate() 在類第一次構(gòu)造后由MFC調(diào)用OnUpdate()

由MFC調(diào)用對(duì)文檔的修改進(jìn)行響應(yīng)GetDocument()

獲取文檔指針CView——的子類CEditView

簡(jiǎn)單的文本編輯器,類似NotepadCScrollView

支持滾動(dòng)條的視圖CFormView

窗體視圖,支持在上邊使用對(duì)話框控件5.Doc/View訪問方法Doc/View結(jié)構(gòu)的幾個(gè)基本成員經(jīng)常需要互相訪問,假設(shè)某個(gè)視圖想要獲得文檔,或某個(gè)框架需要獲得活動(dòng)視圖,可以通過下表提供的方法進(jìn)行解決。當(dāng)前位置訪問位置訪問方法文檔視圖GetFirstViewPositionGetNextView視圖文檔GetDocument視圖框架GetParentFrame框架視圖GetActiveView框架文檔GetActiveDocument任何位置應(yīng)用程序AfxGetApp任何位置主框架AfxGetMainWnd11.3.MFC菜單設(shè)計(jì)在視圖類CDemoView頭文件加入如下聲明:COLORREFm_nColors[3];//可選顏色數(shù)組DWORD m_nColorIndex; //當(dāng)前顏色索引CString m_strShow; //顯示的內(nèi)容BOOLm_bShow;//是否顯示MFC菜單設(shè)計(jì)---變量初始化CDemoView::CDemoView(){m_nColors[0]=RGB(255,0,0);m_nColors[1]=RGB(0,255,0);m_nColors[2]=RGB(0,0,255);m_nColorIndex=0;m_strShow="HelloWorld!";m_bShow=TRUE;}MFC菜單設(shè)計(jì)---繪圖代碼CDemoView::OnDraw(CDC*pDC){if(m_bShow){ pDC->SetTextColor(

m_nColors[m_nColorIndex]);pDC->TextOut(100,100,m_strShow);}}MFC菜單設(shè)計(jì)---消息映射1、ON_COMMAND消息映射宏語法:ON_COMMAND(ID,func)說明:處理WM_COMMAND消息。參數(shù):(1)ID:WM_COMMAND消息附帶的控件ID;(2)func:消息處理函數(shù),原型為:voidfunc(void);對(duì)WM_COMMAND消息的響應(yīng):protected://{{AFX_MSG(CDemoView)afx_msgvoidOnOperShow();//}}AFX_MSGID_OPER_SHOW對(duì)應(yīng)的WM_COMMAND消息的映射BEGIN_MESSAGE_MAP(CDemoView,CView)//{{AFX_MSG_MAP(CDemoView) ON_COMMAND(ID_OPER_SHOW,OnOperShow)//}}AFX_MSG_MAPEND_MESSAGE_MAP()命令消息功能代碼voidCDemoView::OnOperShow(){ m_bShow=!m_bShow; Invalidate(); //強(qiáng)制程序重新窗口}2、ON_UPDATE_COMMAND_UI該消息在窗口將要繪制菜單項(xiàng)的時(shí)候產(chǎn)生語法:ON_UPDATE_COMMAND_UI(ID,func)說明:處理MFC請(qǐng)求,用于更新界面狀態(tài)。參數(shù):(1)ID是控件ID;(2)func是消息處理函數(shù),原型為:voidfunc(CcmdUI*pCmdUI);2023/2/4MFC菜單設(shè)計(jì)---消息映射ID_OPER_SHOW對(duì)UPDATE_COMMAND_UI消息的處理:voidCDemoView::OnUpdateOperShow(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_bShow);}CCmdUICCmdUI沒有基類,它僅在一個(gè)CCmdTarget派生類的ON_UPDATE_COMMAND_UI處理程序中使用。當(dāng)用戶在應(yīng)用的下拉菜單時(shí),要確定每個(gè)菜單項(xiàng)的顯示狀態(tài)——允許存取或禁止存取。菜單命令的目標(biāo)通過實(shí)現(xiàn)一個(gè)ON_UPDATE_COMMAND_UI處理來提供這些信息。當(dāng)菜單被下拉時(shí),框架搜索并調(diào)用每個(gè)ON_UPDATE_COMMAND_UI處理,每個(gè)處理調(diào)用Enable和Check之類的成員函數(shù),相應(yīng)地,框架就可以正確地顯示每個(gè)菜單項(xiàng)了。CCmdUI(1)禁止或者允許該菜單項(xiàng)voidEnable(BOOLbOn=TRUE);(2)設(shè)置菜單項(xiàng)/工具條按鈕的check狀態(tài),顯示標(biāo)志為“√”voidSetCheck(intnCheck=1);(3)與SetCheck功能類似,顯示標(biāo)志為“?”voidSetRadio(BOOLbOn=TRUE);(4)設(shè)置菜單項(xiàng)的Caption屬性voidSetText(LPCTSTRlpszText);3、ON_COMMAND_RANGE語法:ON_COMMAND_RANGE(IDFirst,IDLast,func)說明:處理一個(gè)ID范圍內(nèi)的WM_COMMAND消息。參數(shù):(1)IDFirst是范圍內(nèi)第一個(gè)控件ID;(2)IDLast是范圍內(nèi)最后一個(gè)控件ID;(3)func是消息處理函數(shù),原型為:voidfunc(WORDid);MFC菜單設(shè)計(jì)---消息映射ClassWizard不支持ON_COMMAND_RANGE的自動(dòng)映射,只能手工添加。消息映射宏BEGIN_MESSAGE_MAP(CDemoView,CView) ON_COMMAND_RANGE(ID_OPER_RED,ID_OPER_BLUE,OnOperColorChange)END_MESSAGE_MAP()消息處理函數(shù)//{{AFX_MSG(CDemoView)afx_msgvoidOnOperShow();afx_msgvoidOnUpdateOperShow(CCmdUI*pCmdUI);//}}AFX_MSGafx_msgvoidOnOperColorChange(WORDnID);命令消息功能代碼voidCDemoView::OnOperColorChange(WORDnID){m_nColorIndex=nID-ID_OPER_RED; Invalidate();}4、ON_UPDATE_COMMAND_UI_RANGE語法:ON_UPDATE_COMMAND_UI_RANGE(IDFirst,IDLast,func)說明:處理MFC請(qǐng)求,用于更新界面狀態(tài)。參數(shù):(1)IDFirst是范圍內(nèi)第一個(gè)控件ID;(2)IDLast是范圍內(nèi)最后一個(gè)控件ID;(3)func是消息處理函數(shù),原型為:voidfunc(CcmdUI*pCmdUI);MFC菜單設(shè)計(jì)---消息映射手工添加消息映射函數(shù)定義afx_msgvoidOnUpdateOperColorChange(CCmdUI*pCmdUI);手工添加消息映射宏ON_UPDATE_COMMAND_UI_RANGE(ID_OPER_RED,ID_OPER_BLUE,OnUpdateOperColorChange)手工添加消息處理成員函數(shù)voidCDemoView::OnUpdateOperColorChange(CCmdUI*pCmdUI){pCmdUI->SetRadio(m_nColorIndex==(pCmdUI->m_nID-ID_OPER_RED));}注:由于CCmdUI類的成員m_nID就是調(diào)用該函數(shù)時(shí)當(dāng)前的菜單項(xiàng)ID,因此該函數(shù)沒有nID這個(gè)參數(shù)。11.4SDI編程實(shí)例主窗口中央顯示一文本“您好,單文檔界面的例程!”。單擊“改變顯示文本”菜單項(xiàng)彈出一個(gè)對(duì)話框,可改變主窗口中的顯示文本內(nèi)容程序設(shè)計(jì)步驟:(1)創(chuàng)建工程文件和對(duì)話框資源創(chuàng)建單文檔工程MySdi,添加對(duì)話框資源(2)為CMySdiDoc類添加成員變量,存放字符串在CMySdiDoc類的定義中增加如下的代碼:

CStringm_str;43(3)文檔變量初始化打開CMySdiDoc.cpp文件,在OnNewDocument成員函數(shù)加入以下代碼:BOOLCMySdiDoc::OnNewDocument(){ if(!CDocument::OnNewDocument()) returnFALSE; m_str=“您好,單文檔界面的例程!” //初始化成員變量

returnTRUE;}44(4)視圖的輸出MySdi程序視圖類CMySdiView類的OnDraw成員函數(shù):voidCMySdiView::OnDraw(CDC*pDC){//調(diào)用GetDocument()得到文檔類的指針CMySdiDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRectrectClient; GetClientRect(rectClient); //獲取當(dāng)前客戶區(qū)的指針CSizesizeClient=rectClient.Size();//獲取當(dāng)前客戶區(qū)的大小//調(diào)用TextOut()將m_str的內(nèi)容顯示到框架窗口中的視圖中pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2, (sizeClient.cy-sizeTextExtent.cy)/2,

pDoc-->m_str);}

45(5)改變顯示文本在“編輯”菜單中添加菜單項(xiàng)“改變顯示文本”(ID_EDIT_CHANGETEXT)。單擊此菜單項(xiàng)可以將將對(duì)視圖中顯示文本所做的修改voidCMySdiDoc::OnEditChangetext(){CDlgInputinputDlg; //創(chuàng)建一個(gè)

CInputDlg類的對(duì)象inputDlgif(inputDlg.DoModal()==IDOK) //顯示對(duì)話框

{ m_str=inputDlg.m_input; //獲取輸入的字符串

UpdateAllViews(NULL); //更新視圖}}在MySdiDoc.cpp文件中加入CDlgInput類的頭文件

#include"DlgInput.h"

//加入頭文件46(6)文檔串行化把修改保存到磁盤中voidCMySdiDoc::Serialize(CArchive&ar){ if(ar.IsStoring())

{//TODO:addstoringcodehere ar<<m_str; } else

{//TODO:addloadingcodehere ar>>m_str; }}47MyMdi1系統(tǒng)默認(rèn)生成的文檔MyMdi21用戶自定義文檔(不允許打印)活動(dòng)文檔的類型改變“編輯”子菜單不同“打印”按鈕不同11.5MDI編程實(shí)例文檔模板和文檔/視圖的生成過程CDocTemplateCDocTemplate(UINTnIDResource,//文檔類型資源CRuntimeClass*pDocClass,CRuntimeClass*pFrameClass,CRuntimeClass*pViewClass);CRuntimeClassC++對(duì)象運(yùn)行時(shí)的信息(1)創(chuàng)建MDI工程文件Step4-AdvancedFileextension

mmdFiltername:

MyMdi文件(*.mmd)在Step6設(shè)置CMyMdiView類基類為CEditView。(2)創(chuàng)建第二種文檔和視圖類ClassWizard->ClassInfo->AddClass->New52(3)創(chuàng)建資源文檔模板字符串nIDResource <WindowTitle>\n<DocName>\n<FileNewName>\n<FilterName>\n<FilterExt>\n<RegFileTypeID>\n<RegFileTypeName>第一個(gè)文檔資源字符串IDR_MYMDITYPE

\nMyMdi\nMyMdi\nMyMdi文件(*.mmd)\n.mmd\nMyMdi.Document\nMyMdiDocument注意:第一個(gè)文檔模板字符串由應(yīng)用程序向?qū)?,第二文檔模板字符串需要手動(dòng)添加。添加第二個(gè)文檔資源字符串方法一:直接編輯MyMdi.rc資源文件加入:IDR_MYMDITYPE2“\nMyMdi2\nMyMdi2\nMyMdi2文件(*.mm2)\n.mm2\nMyMdi2.Document\nMyMdi2Document”方法二:通過編輯資源StringTable(4)代碼編輯(a)創(chuàng)建文檔模板類在

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論