




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
VisualC++第十一章
單文檔與多文檔11.1概述MFCAppWizard支持的應(yīng)用程序類型1.單文檔界面(SDI)
——只有一個窗口每一個文檔可以有多個視圖每個視圖只能對應(yīng)于一個確定的文檔2.多文檔界面(MDI)——有多個子窗口,同時對多個文檔進行操作解決多個文檔的數(shù)據(jù)管理方法每次打開一個新文檔派生的新的MDI子窗口3.基于對話框的應(yīng)用程序SDI文檔/視圖應(yīng)用程序示意圖
文檔/視圖結(jié)構(gòu)基本思想:數(shù)據(jù)管理和顯示分開文檔負責(zé)數(shù)據(jù)管理和維護,數(shù)據(jù)保存在文檔類的成員變量中磁盤文件中讀取、保存數(shù)據(jù)處理菜單、工具欄按鈕和加速鍵的WM_COMMAND消息(命令消息),但不處理其它Windows消息。視圖在文檔和用戶之間起中介作用接收用戶的輸入,并接受用戶的修改直接或間接的訪問文檔類中的成員變量,從文檔類中(不是從存儲介質(zhì)中)取數(shù)據(jù)并顯示通過調(diào)用文檔和視圖的接口將修改的信息反饋給文檔類,實際的數(shù)據(jù)更新仍然是由文檔來完成的。命令消息(WM_COMMAND)產(chǎn)生選擇菜單項單擊快捷鍵工具條按鈕處理框架窗口(大多數(shù)命令)視圖、文檔、文檔模板、
應(yīng)用程序類也可以處理注意窗口消息和控件通知消息
只能由窗口和視圖處理。文檔/視圖結(jié)構(gòu)程序基本結(jié)構(gòu):應(yīng)用程序?qū)ο螅–WinApp)框架窗口對象(CFrameWnd)文檔對象(CDocument)視圖對象(CView)文檔模板對象(CDocTemplate)文檔/視圖結(jié)構(gòu)1、應(yīng)用程序?qū)ο?--CWinApp的派生類(1)管理應(yīng)用程序的初始化;(2)保持文檔、視圖和框架窗口之間的關(guān)系;(3)接收Windows消息,進行消息的調(diào)度;2、框架窗口對象---CFrameWnd的派生類(1)提供應(yīng)用程序主窗口;(2)工具欄、狀態(tài)欄的創(chuàng)建、初始化和銷毀;文檔/視圖結(jié)構(gòu)3、文檔對象:CDocument的派生類(1)管理和維護數(shù)據(jù),串行化功能;(2)處理WM_COMMAND消息;4、視圖對象:CView的派生類(1)文檔和用戶的中介;(2)讀取文檔中的數(shù)據(jù),顯示到屏幕上;視圖通過GetDocument成員函數(shù)獲得指向相關(guān)聯(lián)的文檔對象的指針通過該指針調(diào)用文檔類的成員函數(shù)來從文檔中讀取數(shù)據(jù)視圖把數(shù)據(jù)顯示于計算機屏幕上用戶通過與視圖的交互來查看數(shù)據(jù)并對數(shù)據(jù)進行修改視圖通過相關(guān)聯(lián)的文檔類的成員函數(shù)將經(jīng)過修改的數(shù)據(jù)傳遞給文檔對象文檔對象獲得修改過的數(shù)據(jù)之后,對其進行必要的修改,最后保存到永久介質(zhì)(如磁盤文件)中文檔/視圖結(jié)構(gòu)的工作機制11.2.Doc/View框架的主要成員(1)CWinApp(2)CFrameWnd(3)Cdocument(4)CView10(1)CWinAppCWinApp類代表主程序,負責(zé)維護進程的啟動、終止、消息循環(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框架窗口維護了很多幕后的工作,例如工具條、菜單、狀態(tài)條的顯示、更新,視圖的位置和顯示,其它可??靠丶耐?亢蛣討B(tài)尺寸調(diào)整。許多默認為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——文檔串行化串行化:將對象寫入字節(jié)流和從字節(jié)流恢復(fù)對象的操作。串行化除了可以使用文件保存對象之外,還可以通過網(wǎng)絡(luò)、串口傳輸對象,因此使用字節(jié)流。
串行化處理通常是通過CArchive類來完成的。CDocument——文檔串行化CArchive類的常用成員WriteString 寫入字符串ReadString 讀取字符串ReadClass 讀取類信息WriteClass 寫入類信息Read 讀取字節(jié)內(nèi)容Write 寫入字節(jié)內(nèi)容CDocument——文檔串行化CArchive類的常用成員operator<< 將基本類型寫入流中operator>> 從流中讀取基本類型ReadObject 讀取串行化對象WriteObject 寫入串行化對象Flush 將緩沖區(qū)中的數(shù)據(jù)強制寫入流中(4)CView視圖類(CView)是從CWnd類下派生的,視圖類具有CWnd的所有功能如:創(chuàng)建、移動、顯示和隱藏窗口等。CView類可以接收任何Windows消息,而CDocument類則不行。CView——常用方法OnDraw由MFC調(diào)用發(fā)出文檔到設(shè)備描述表在屏幕發(fā)生變化或因為焦點的變化需要重繪時調(diào)用,沒有該函數(shù),就不可能在程序的切換后保證屏幕的正確顯示。若想在數(shù)據(jù)更新的時強制視圖更新,可調(diào)用Invalidate方法和UpdateWindow方法來實現(xiàn)。CView——常用方法OnInitialUpdate() 在類第一次構(gòu)造后由MFC調(diào)用OnUpdate()
由MFC調(diào)用對文檔的修改進行響應(yīng)GetDocument()
獲取文檔指針CView——的子類CEditView
簡單的文本編輯器,類似NotepadCScrollView
支持滾動條的視圖CFormView
窗體視圖,支持在上邊使用對話框控件5.Doc/View訪問方法Doc/View結(jié)構(gòu)的幾個基本成員經(jīng)常需要互相訪問,假設(shè)某個視圖想要獲得文檔,或某個框架需要獲得活動視圖,可以通過下表提供的方法進行解決。當前位置訪問位置訪問方法文檔視圖GetFirstViewPositionGetNextView視圖文檔GetDocument視圖框架GetParentFrame框架視圖GetActiveView框架文檔GetActiveDocument任何位置應(yīng)用程序AfxGetApp任何位置主框架AfxGetMainWnd11.3.MFC菜單設(shè)計在視圖類CDemoView頭文件加入如下聲明:COLORREFm_nColors[3];//可選顏色數(shù)組DWORD m_nColorIndex; //當前顏色索引CString m_strShow; //顯示的內(nèi)容BOOLm_bShow;//是否顯示MFC菜單設(shè)計---變量初始化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è)計---繪圖代碼CDemoView::OnDraw(CDC*pDC){if(m_bShow){ pDC->SetTextColor(
m_nColors[m_nColorIndex]);pDC->TextOut(100,100,m_strShow);}}MFC菜單設(shè)計---消息映射1、ON_COMMAND消息映射宏語法:ON_COMMAND(ID,func)說明:處理WM_COMMAND消息。參數(shù):(1)ID:WM_COMMAND消息附帶的控件ID;(2)func:消息處理函數(shù),原型為:voidfunc(void);對WM_COMMAND消息的響應(yīng):protected://{{AFX_MSG(CDemoView)afx_msgvoidOnOperShow();//}}AFX_MSGID_OPER_SHOW對應(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(); //強制程序重新窗口}2、ON_UPDATE_COMMAND_UI該消息在窗口將要繪制菜單項的時候產(chǎn)生語法:ON_UPDATE_COMMAND_UI(ID,func)說明:處理MFC請求,用于更新界面狀態(tài)。參數(shù):(1)ID是控件ID;(2)func是消息處理函數(shù),原型為:voidfunc(CcmdUI*pCmdUI);2023/2/4MFC菜單設(shè)計---消息映射ID_OPER_SHOW對UPDATE_COMMAND_UI消息的處理:voidCDemoView::OnUpdateOperShow(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_bShow);}CCmdUICCmdUI沒有基類,它僅在一個CCmdTarget派生類的ON_UPDATE_COMMAND_UI處理程序中使用。當用戶在應(yīng)用的下拉菜單時,要確定每個菜單項的顯示狀態(tài)——允許存取或禁止存取。菜單命令的目標通過實現(xiàn)一個ON_UPDATE_COMMAND_UI處理來提供這些信息。當菜單被下拉時,框架搜索并調(diào)用每個ON_UPDATE_COMMAND_UI處理,每個處理調(diào)用Enable和Check之類的成員函數(shù),相應(yīng)地,框架就可以正確地顯示每個菜單項了。CCmdUI(1)禁止或者允許該菜單項voidEnable(BOOLbOn=TRUE);(2)設(shè)置菜單項/工具條按鈕的check狀態(tài),顯示標志為“√”voidSetCheck(intnCheck=1);(3)與SetCheck功能類似,顯示標志為“?”voidSetRadio(BOOLbOn=TRUE);(4)設(shè)置菜單項的Caption屬性voidSetText(LPCTSTRlpszText);3、ON_COMMAND_RANGE語法:ON_COMMAND_RANGE(IDFirst,IDLast,func)說明:處理一個ID范圍內(nèi)的WM_COMMAND消息。參數(shù):(1)IDFirst是范圍內(nèi)第一個控件ID;(2)IDLast是范圍內(nèi)最后一個控件ID;(3)func是消息處理函數(shù),原型為:voidfunc(WORDid);MFC菜單設(shè)計---消息映射ClassWizard不支持ON_COMMAND_RANGE的自動映射,只能手工添加。消息映射宏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請求,用于更新界面狀態(tài)。參數(shù):(1)IDFirst是范圍內(nèi)第一個控件ID;(2)IDLast是范圍內(nèi)最后一個控件ID;(3)func是消息處理函數(shù),原型為:voidfunc(CcmdUI*pCmdUI);MFC菜單設(shè)計---消息映射手工添加消息映射函數(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ù)時當前的菜單項ID,因此該函數(shù)沒有nID這個參數(shù)。11.4SDI編程實例主窗口中央顯示一文本“您好,單文檔界面的例程!”。單擊“改變顯示文本”菜單項彈出一個對話框,可改變主窗口中的顯示文本內(nèi)容程序設(shè)計步驟:(1)創(chuàng)建工程文件和對話框資源創(chuàng)建單文檔工程MySdi,添加對話框資源(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); //獲取當前客戶區(qū)的指針CSizesizeClient=rectClient.Size();//獲取當前客戶區(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)改變顯示文本在“編輯”菜單中添加菜單項“改變顯示文本”(ID_EDIT_CHANGETEXT)。單擊此菜單項可以將將對視圖中顯示文本所做的修改voidCMySdiDoc::OnEditChangetext(){CDlgInputinputDlg; //創(chuàng)建一個
CInputDlg類的對象inputDlgif(inputDlg.DoModal()==IDOK) //顯示對話框
{ 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)默認生成的文檔MyMdi21用戶自定義文檔(不允許打印)活動文檔的類型改變“編輯”子菜單不同“打印”按鈕不同11.5MDI編程實例文檔模板和文檔/視圖的生成過程CDocTemplateCDocTemplate(UINTnIDResource,//文檔類型資源CRuntimeClass*pDocClass,CRuntimeClass*pFrameClass,CRuntimeClass*pViewClass);CRuntimeClassC++對象運行時的信息(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>第一個文檔資源字符串IDR_MYMDITYPE
\nMyMdi\nMyMdi\nMyMdi文件(*.mmd)\n.mmd\nMyMdi.Document\nMyMdiDocument注意:第一個文檔模板字符串由應(yīng)用程序向?qū)?,第二文檔模板字符串需要手動添加。添加第二個文檔資源字符串方法一:直接編輯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等.壓縮文件請下載最新的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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 哈工大張秉剛:激光焊接技術(shù)課件
- 檢測新質(zhì)生產(chǎn)力
- 《企業(yè)員工公文寫作》課件
- 臨沂職業(yè)學(xué)院《高級英語III》2023-2024學(xué)年第二學(xué)期期末試卷
- 吉林市重點中學(xué)2025年高三下第三次階段過關(guān)語文試題試卷含解析
- 山西警察學(xué)院《油畫人物寫生術(shù)科技能教學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 吉林省白山市長白縣重點達標名校2024-2025學(xué)年初三下學(xué)期第三次質(zhì)量考評數(shù)學(xué)試題含解析
- 柯坪縣2025年數(shù)學(xué)五下期末經(jīng)典模擬試題含答案
- 金陵科技學(xué)院《口腔頜面外科學(xué)1》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)江職業(yè)技術(shù)學(xué)院《工程計量與計價軟件》2023-2024學(xué)年第二學(xué)期期末試卷
- 濃縮機的選擇與計算
- 滬教版六年級下冊單詞表
- 團代會PPT模板
- 地基基礎(chǔ)軟弱下臥層驗算計算表格
- 最新投標書密封條
- SAPFI清賬接口和部分清賬接口例子
- TWI之工作改善JM精講
- 聚酯裝置流程與聚酯生產(chǎn)概述
- 鄉(xiāng)鎮(zhèn)綜治中心管理考核辦法(試行)
- BIM培訓(xùn)計劃Revit 培訓(xùn)計劃
- 中考英語常用特殊疑問句總結(jié)
評論
0/150
提交評論