vc第11章 单文档多文档_第1页
vc第11章 单文档多文档_第2页
vc第11章 单文档多文档_第3页
vc第11章 单文档多文档_第4页
vc第11章 单文档多文档_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VisualC++第十一章

单文档与多文档11.1概述MFCAppWizard支持的应用程序类型1.单文档界面(SDI)

——只有一个窗口每一个文档可以有多个视图每个视图只能对应于一个确定的文档2.多文档界面(MDI)——有多个子窗口,同时对多个文档进行操作解决多个文档的数据管理方法每次打开一个新文档派生的新的MDI子窗口3.基于对话框的应用程序SDI文档/视图应用程序示意图

文档/视图结构基本思想:数据管理和显示分开文档负责数据管理和维护,数据保存在文档类的成员变量中磁盘文件中读取、保存数据处理菜单、工具栏按钮和加速键的WM_COMMAND消息(命令消息),但不处理其它Windows消息。视图在文档和用户之间起中介作用接收用户的输入,并接受用户的修改直接或间接的访问文档类中的成员变量,从文档类中(不是从存储介质中)取数据并显示通过调用文档和视图的接口将修改的信息反馈给文档类,实际的数据更新仍然是由文档来完成的。命令消息(WM_COMMAND)产生选择菜单项单击快捷键工具条按钮处理框架窗口(大多数命令)视图、文档、文档模板、

应用程序类也可以处理注意窗口消息和控件通知消息

只能由窗口和视图处理。文档/视图结构程序基本结构:应用程序对象(CWinApp)框架窗口对象(CFrameWnd)文档对象(CDocument)视图对象(CView)文档模板对象(CDocTemplate)文档/视图结构1、应用程序对象---CWinApp的派生类(1)管理应用程序的初始化;(2)保持文档、视图和框架窗口之间的关系;(3)接收Windows消息,进行消息的调度;2、框架窗口对象---CFrameWnd的派生类(1)提供应用程序主窗口;(2)工具栏、状态栏的创建、初始化和销毁;文档/视图结构3、文档对象:CDocument的派生类(1)管理和维护数据,串行化功能;(2)处理WM_COMMAND消息;4、视图对象:CView的派生类(1)文档和用户的中介;(2)读取文档中的数据,显示到屏幕上;视图通过GetDocument成员函数获得指向相关联的文档对象的指针通过该指针调用文档类的成员函数来从文档中读取数据视图把数据显示于计算机屏幕上用户通过与视图的交互来查看数据并对数据进行修改视图通过相关联的文档类的成员函数将经过修改的数据传递给文档对象文档对象获得修改过的数据之后,对其进行必要的修改,最后保存到永久介质(如磁盘文件)中文档/视图结构的工作机制11.2.Doc/View框架的主要成员(1)CWinApp(2)CFrameWnd(3)Cdocument(4)CView10(1)CWinAppCWinApp类代表主程序,负责维护进程的启动、终止、消息循环、命令行参数、资源管理。可以调用AfxGetApp获取CWinApp类型指针。成员 描述m_pszAppName 应用程序名m_lpCmdLine 命令行参数m_pMainWnd 应用程序主窗口指针m_pszExeName 可执行文件名m_pszProfileName 配置INI文件名InitInstance MFC程序的入口ExitInstance MFC程序的出口(2)CFrameWnd框架窗口维护了很多幕后的工作,例如工具条、菜单、状态条的显示、更新,视图的位置和显示,其它可停靠控件的停靠和动态尺寸调整。许多默认为MFC应用程序应该具备的基本功能都是CFrameWnd类在完成。(3)CDocument视图操作voidAddView(CView*pView);voidRemoveView(CView*pView);voidUpdateAllView(CView*pSender, LPARAMlHint=0L, CObject*pHint=NULL);CDocument——视图管理视图遍历用户可通过函数GetFirstViewPosition()和GetNextView()得到和文档关联的视图的指针。POSITIONGetFirstViewPosition()const;CView*GetNextView(POSITION&rPosition);CDocument——视图管理视图遍历//得到视图列表头的位置POSITIONpos=GetFirstViewPosition();while(pos!=NULL){//获得视图指针CView*pView=GetNextView(pos); …}CDocument——文档串行化串行化:将对象写入字节流和从字节流恢复对象的操作。串行化除了可以使用文件保存对象之外,还可以通过网络、串口传输对象,因此使用字节流。

串行化处理通常是通过CArchive类来完成的。CDocument——文档串行化CArchive类的常用成员WriteString 写入字符串ReadString 读取字符串ReadClass 读取类信息WriteClass 写入类信息Read 读取字节内容Write 写入字节内容CDocument——文档串行化CArchive类的常用成员operator<< 将基本类型写入流中operator>> 从流中读取基本类型ReadObject 读取串行化对象WriteObject 写入串行化对象Flush 将缓冲区中的数据强制写入流中(4)CView视图类(CView)是从CWnd类下派生的,视图类具有CWnd的所有功能如:创建、移动、显示和隐藏窗口等。CView类可以接收任何Windows消息,而CDocument类则不行。CView——常用方法OnDraw由MFC调用发出文档到设备描述表在屏幕发生变化或因为焦点的变化需要重绘时调用,没有该函数,就不可能在程序的切换后保证屏幕的正确显示。若想在数据更新的时强制视图更新,可调用Invalidate方法和UpdateWindow方法来实现。CView——常用方法OnInitialUpdate() 在类第一次构造后由MFC调用OnUpdate()

由MFC调用对文档的修改进行响应GetDocument()

获取文档指针CView——的子类CEditView

简单的文本编辑器,类似NotepadCScrollView

支持滚动条的视图CFormView

窗体视图,支持在上边使用对话框控件5.Doc/View访问方法Doc/View结构的几个基本成员经常需要互相访问,假设某个视图想要获得文档,或某个框架需要获得活动视图,可以通过下表提供的方法进行解决。当前位置访问位置访问方法文档视图GetFirstViewPositionGetNextView视图文档GetDocument视图框架GetParentFrame框架视图GetActiveView框架文档GetActiveDocument任何位置应用程序AfxGetApp任何位置主框架AfxGetMainWnd11.3.MFC菜单设计在视图类CDemoView头文件加入如下声明:COLORREFm_nColors[3];//可选颜色数组DWORD m_nColorIndex; //当前颜色索引CString m_strShow; //显示的内容BOOLm_bShow;//是否显示MFC菜单设计---变量初始化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菜单设计---绘图代码CDemoView::OnDraw(CDC*pDC){if(m_bShow){ pDC->SetTextColor(

m_nColors[m_nColorIndex]);pDC->TextOut(100,100,m_strShow);}}MFC菜单设计---消息映射1、ON_COMMAND消息映射宏语法:ON_COMMAND(ID,func)说明:处理WM_COMMAND消息。参数:(1)ID:WM_COMMAND消息附带的控件ID;(2)func:消息处理函数,原型为:voidfunc(void);对WM_COMMAND消息的响应:protected://{{AFX_MSG(CDemoView)afx_msgvoidOnOperShow();//}}AFX_MSGID_OPER_SHOW对应的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该消息在窗口将要绘制菜单项的时候产生语法:ON_UPDATE_COMMAND_UI(ID,func)说明:处理MFC请求,用于更新界面状态。参数:(1)ID是控件ID;(2)func是消息处理函数,原型为:voidfunc(CcmdUI*pCmdUI);2023/2/4MFC菜单设计---消息映射ID_OPER_SHOW对UPDATE_COMMAND_UI消息的处理:voidCDemoView::OnUpdateOperShow(CCmdUI*pCmdUI){ pCmdUI->SetCheck(m_bShow);}CCmdUICCmdUI没有基类,它仅在一个CCmdTarget派生类的ON_UPDATE_COMMAND_UI处理程序中使用。当用户在应用的下拉菜单时,要确定每个菜单项的显示状态——允许存取或禁止存取。菜单命令的目标通过实现一个ON_UPDATE_COMMAND_UI处理来提供这些信息。当菜单被下拉时,框架搜索并调用每个ON_UPDATE_COMMAND_UI处理,每个处理调用Enable和Check之类的成员函数,相应地,框架就可以正确地显示每个菜单项了。CCmdUI(1)禁止或者允许该菜单项voidEnable(BOOLbOn=TRUE);(2)设置菜单项/工具条按钮的check状态,显示标志为“√”voidSetCheck(intnCheck=1);(3)与SetCheck功能类似,显示标志为“•”voidSetRadio(BOOLbOn=TRUE);(4)设置菜单项的Caption属性voidSetText(LPCTSTRlpszText);3、ON_COMMAND_RANGE语法:ON_COMMAND_RANGE(IDFirst,IDLast,func)说明:处理一个ID范围内的WM_COMMAND消息。参数:(1)IDFirst是范围内第一个控件ID;(2)IDLast是范围内最后一个控件ID;(3)func是消息处理函数,原型为:voidfunc(WORDid);MFC菜单设计---消息映射ClassWizard不支持ON_COMMAND_RANGE的自动映射,只能手工添加。消息映射宏BEGIN_MESSAGE_MAP(CDemoView,CView) ON_COMMAND_RANGE(ID_OPER_RED,ID_OPER_BLUE,OnOperColorChange)END_MESSAGE_MAP()消息处理函数//{{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请求,用于更新界面状态。参数:(1)IDFirst是范围内第一个控件ID;(2)IDLast是范围内最后一个控件ID;(3)func是消息处理函数,原型为:voidfunc(CcmdUI*pCmdUI);MFC菜单设计---消息映射手工添加消息映射函数定义afx_msgvoidOnUpdateOperColorChange(CCmdUI*pCmdUI);手工添加消息映射宏ON_UPDATE_COMMAND_UI_RANGE(ID_OPER_RED,ID_OPER_BLUE,OnUpdateOperColorChange)手工添加消息处理成员函数voidCDemoView::OnUpdateOperColorChange(CCmdUI*pCmdUI){pCmdUI->SetRadio(m_nColorIndex==(pCmdUI->m_nID-ID_OPER_RED));}注:由于CCmdUI类的成员m_nID就是调用该函数时当前的菜单项ID,因此该函数没有nID这个参数。11.4SDI编程实例主窗口中央显示一文本“您好,单文档界面的例程!”。单击“改变显示文本”菜单项弹出一个对话框,可改变主窗口中的显示文本内容程序设计步骤:(1)创建工程文件和对话框资源创建单文档工程MySdi,添加对话框资源(2)为CMySdiDoc类添加成员变量,存放字符串在CMySdiDoc类的定义中增加如下的代码:

CStringm_str;43(3)文档变量初始化打开CMySdiDoc.cpp文件,在OnNewDocument成员函数加入以下代码:BOOLCMySdiDoc::OnNewDocument(){ if(!CDocument::OnNewDocument()) returnFALSE; m_str=“您好,单文档界面的例程!” //初始化成员变量

returnTRUE;}44(4)视图的输出MySdi程序视图类CMySdiView类的OnDraw成员函数:voidCMySdiView::OnDraw(CDC*pDC){//调用GetDocument()得到文档类的指针CMySdiDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRectrectClient; GetClientRect(rectClient); //获取当前客户区的指针CSizesizeClient=rectClient.Size();//获取当前客户区的大小//调用TextOut()将m_str的内容显示到框架窗口中的视图中pDC->TextOut((sizeClient.cx-sizeTextExtent.cx)/2, (sizeClient.cy-sizeTextExtent.cy)/2,

pDoc-->m_str);}

45(5)改变显示文本在“编辑”菜单中添加菜单项“改变显示文本”(ID_EDIT_CHANGETEXT)。单击此菜单项可以将将对视图中显示文本所做的修改voidCMySdiDoc::OnEditChangetext(){CDlgInputinputDlg; //创建一个

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系统默认生成的文档MyMdi21用户自定义文档(不允许打印)活动文档的类型改变“编辑”子菜单不同“打印”按钮不同11.5MDI编程实例文档模板和文档/视图的生成过程CDocTemplateCDocTemplate(UINTnIDResource,//文档类型资源CRuntimeClass*pDocClass,CRuntimeClass*pFrameClass,CRuntimeClass*pViewClass);CRuntimeClassC++对象运行时的信息(1)创建MDI工程文件Step4-AdvancedFileextension

mmdFiltername:

MyMdi文件(*.mmd)在Step6设置CMyMdiView类基类为CEditView。(2)创建第二种文档和视图类ClassWizard->ClassInfo->AddClass->New52(3)创建资源文档模板字符串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注意:第一个文档模板字符串由应用程序向导生成,第二文档模板字符串需要手动添加。添加第二个文档资源字符串方法一:直接编辑MyMdi.rc资源文件加入:IDR_MYMDITYPE2“\nMyMdi2\nMyMdi2\nMyMdi2文件(*.mm2)\n.mm2\nMyMdi2.Document\nMyMdi2Document”方法二:通过编辑资源StringTable(4)代码编辑(a)创建文档模板类在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论