资源描述
单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,第,12,讲 单文档与多文档,要点:,1,、介绍,Visual C+,中的文档,/,视图结构的工作机制,2,、编写单文档应用程序,3,、编写多文档应用程序,1,一、,单文档与多文档,VC,的,MFC,库支持三种不同的应用程序,单文档界面,(SDI),多文档界面,(MDI),基于对话框的应用程序,SDI,的应用程序,只有一个窗口,MDI,的应用程序每次,可以读写多个文件或,文档,可同时对多个,文档进行操作,可以,有多个子窗口,主要差别,在创建,SDI,界面的应用程序时,,CMainFrame,类的基类为,CFrameWnd,在创建,MDI,界面的应用程序时,,CMainFrame,类的基类为,MDIFrameWnd,,增加了,CChildFrame,类,使用,MFC,向导创建,SDI,和,MDI,的应用程序的过程几乎完全一样,文档,/,视图结构,使用,MFC,向导创建,SDI,和,MDI,的程序框架时,构成了一个相互关联的结构,称为文档,/,视图结构。在这个框架中,数据的维护及其显示,分别由两个不同但又紧密相关的类,文档类和视图类负责。,视图负责显示和编辑文档数据,。用户对数据的编辑需要依靠窗口上的鼠标与键盘操作才得以完成,这些消息都是由视图类接收后进行处理或通知文档类,如收到窗口刷新消息时调用视图类的成员函数,OnDraw,(),显示文档内容。,文档负责数据的读写操作,。数据通常被保存在文档类的成员变量中,文档类通过一个称为,串行化,的成员函数,Serialize(),将成员变量的数据保存到磁盘文件中。,框架窗口,就是通常所说的,Windows,主窗口,视图是一个没有边框的窗口,必须依存在一个,框架窗口,内,。,视图、文档、框架窗口,MFC,文档,/,视图结构,数据处理,工作分工:,数据处理,分为数据的管理和显示,文档,用于管理和维护数据,视图,用来显示和编辑数据,MFC,通过其,文档类,和,视图类,提供了大量有关数据处理的方法。,文档,/,视图结构的工作机制,视图,通过,GetDocument,成员函数,获得,指向相关联的,文档对象的指针,通过该指针调用文档类的成员函数来,从文档中读取数据,视图,把,数据显示,于计算机屏幕上,用户,通过与视图的交互来查看数据并,对数据进行修改,视图,通过相关联的文档类的成员函数,将经过修改的数据传递给文档,对象,文档,对象获得修改过的数据之后,对其进行必要的修改,最后,保存到磁盘,),中,SDI,程序,SDI,程序只有一个视图。因此,对应一个文档。,SDI,程序中,框架窗口、文档,和,视图,的创建是在应用程序对象的,InitInstance,(),成员函数中通过,文档模板类,完成的:,下面程序:创建单文档模板,CSingleDocTemplate,*,pDocTemplate,;/,单文档模板类对象,pDocTemplate,=new,CSingleDocTemplate,(IDR_MAINFRAME,RUNTIME_CLASS(,CMyDoc,),/,文档类,RUNTIME_CLASS(,CMainFrame,),/,框架窗口,RUNTIME_CLASS(,CMyView,);,/,视图类,.,MDI,程序,MDI,程序有多个子视图。因此,对应多个文档。,MDI,程序中,框架窗口、文档,和,视图,的创建是在应用程序对象的,InitInstance,(),成员函数中通过,文档模板类,完成的:,下面程序:创建多文档模板,CMultiDocTemplate,*,pDocTemplate,;,pDocTemplate,=new,CMultiDocTemplate,(,IDR_MYMDITYPE,RUNTIME_CLASS(,CMyDoc,),/,文档类,RUNTIME_CLASS(,CChildFrame,),/,框架窗口类,RUNTIME_CLASS(,CMyView,);,/,视图类,如果是多种文档,可定义多个文档模板(,pDocTemplate,),二、,Doc/View,框架的主要成员,MFC,的,Doc/View,框架的核心类只有五个,:,CWinApp,:应用类(主程序),CView,:视图基类,CDocument,:文档基类,CDocTemplate,:文档模板类,CFrameWnd,:框架窗口类,1,CWinApp,类,CWinApp,类代表主程序,,CWinApp,本身是不可见的,它负责维护进程的启动、终止、消息循环、命令行参数、资源管理,成员描述,InitInstance,初始化实例,Exit,Instance,结束实例,常用成员函数,2,CDocument,类,文档类的基类。,在现在流行的,MVC,(,Modal,、,View,、,Control,)设计模式中相当于其中的,Modal,,表示抽象数据模型,。,成员 描述,SetModifyFlag,设置修改标志,UpdateAllView,刷新与文档关联的视图,GetFirstViewPosition,获得,与文档关联的视图头指针,GetNextView,获得下一个,视图指针,Serialize,实现文档数据串行化,常用成员函数,3,CView,类,CWnd,类是视图类,(,CView,),的基类。,视图类具有,CWnd,的所有功能如:创建、移动、显示和隐藏窗口等。,CView,类可以接收任何,Windows,消息,而,CDocument,类则不行,成员 描述,OnDraw,(),由,MFC,调用,重新绘制屏幕,OnUpdate,(),由,MFC,调用对文档的修改进行响应,Invalidate,强制刷新屏幕,CView,主要,虚拟方法,CEditView,:简单的文本编辑器,类似,Notepad,CListView,:基于列表的视图,类似文件夹浏览,CTreeView,:基于树状控件的视图,类似文件浏览左侧的树状结构,CRichEditView,:支持多种字体、,OLE,和,RTF,格式的高级编辑器,CScrollView,:支持滚动条的视图,CFormView,:窗体视图,支持在上边使用对话框控件,CRecordView,:连接到,ODBC,数据库的视图,CDaoRecordView,:连接到,DAO,数据库的视图,CView,的子类,4,CDocTemplate,类,文档模板类将原本独立的文档、视图和框架窗口对象联系在一起。,每一种文档类型都有一种文档模板与之相对应,文档模板负责创建和管理该文档类型的所有文档。,SDI,程序中只有一个文档模板对象,MDI,程序需要针对不同类型的文档定义不同的文档模板对象。,文档 子类,SDI,CSingleDocTemplate,MDI,CMultiDocTemplate,5,CFrameWnd,类,CFrameWnd,类是,CMainFrame,主框架窗口的基类,,CWnd,的子类。,框架窗口维护了很多幕后的工作,例如工具条、菜单、状态条的显示、更新,视图的位置和显示,其它可停靠空间的停靠和动态尺寸调整。许多默认为,MFC,应用程序应该具备的基本功能都是,CFrameWnd,类在完成。,CMDIFrameWnd,子类,CMDIChildWnd,子类,MDI,三、,文档操作中的一些重要概念,串行化处理:,将对象写入字节流和从字节流恢复对象的操作。可以通过文件、网络、串口传输数据。,文档的消息映射:,确定消息传递时具体要传递给哪一个函数。通常,MFC,使用,ClassWizard,添加消息映射,有时也需要手工添加消息映射。,文档消息传递:,明确接收者,判断消息传递的顺序。,当前视图,当前文档,与当前视图,/,文档关联的文档模板,子框架窗口(只有,MDI,有该步骤),主框架窗口,应用程序对象,MFC,消息处理搜索顺序,四,SDI,编程实例,【,例,11-1】,在主窗口中央显示一文本“您好,单文档界面的例程,!”,。单击“改变显示文本”菜单项,,,可弹出一个对话框,通过此对话框可改变主窗口中的显示文本内容,(1),创建工程文件和对话框资源,创建一个单文档项目,文件,T11-1,,然后添加对,话框资源,IDD_DIALOG1,新类:,CInput,,,Edit,控件关联变量,m_input,(2),声明文档类成员变量,在,C,T111,Doc,类的,T111,Doc.h,文件,中增加如下的代码:,Public,:,CString,m_str,;,用以存放字符串,(3),初始化文档类成员变量,在,T11-1,Doc.cpp,文件中,,选择,OnNewDocument,成员函数加入以下代码:,BOOL,C,T111,Doc:OnNewDocument(),if(!,CDocument:OnNewDocument,(),return FALSE;,m_str=L您好,单文档界面的例程!;,/,初始化成员变量,return TRUE;,(4),视图输出显示(,OnDraw,),在,T11-1View.cpp,文件中,选择,OnDraw,成员函数:,void,CT111View:OnDraw,(CDC*,pDC,),/TODO:,在此处为本机数据添加绘制代码,CRect,rectClient,;,GetClientRect(rectClient,);,/,获取当前客户区的指针,CSize,sizeClient,=,rectClient.Size,();,/,获取当前客户区的大小,CString,str,=,pDoc,-,m_str,;,/,从文件中读取数据,CSize,sizeTextExtent,=,pDC,-,GetTextExtent(str,);,/,用新选定的字体绘制字符串,pDC,-,TextOut,(sizeClient.cx-sizeTextExtent.cx)/2,(sizeClient.cy-sizeTextExtent.cy)/2,str,);,调用,GetDocument,(),得到文档类的指针,将文档对象成员变量复制到字符串,str,中,调用,TextOut,(),将,m_str,的内容显示到框架窗口中的视图中。,(5),增加菜单项,与对话框关联,在,“编辑”,菜单中添加菜单项,“改变显示文本”,(,ID_CHANGE,),。单击此菜单项可以将对视图中显示文本所做的修改保存到一个磁盘文件中,具体的实现方法如下:,选择菜单项,快捷菜单:“添加事件处理程序”,选择,Command,消息,添加函数如下。,void,CT111Doc:OnChange(),CInput,Dlg,;,/,创建一个,CInput,类的对象,Dlg,if(Dlg.DoModal,()=IDOK),/,显示对话框,m_str,=,Dlg.m_input,;,/,获取输入的字符串,UpdateAllViews(NULL,);,在,T111,Doc.cpp,文件中加入,CInput,类的头文件,Input.h,代码如下:,#include,Input.h,/,加入头文件,(6),文档数据的保存与读取,为了把文档数据(,m_str,)修改保存到磁盘文件中,并在需要时可以打开所保存的磁盘文件读取文档,需要重载,CExampleDoc,类的,Serialize,函数来完成串行化。重载后的,Serialize,函数的代码如下:,void,CT111Doc:Serialize,(CArchive&,ar,),if(,ar.IsStoring,(),ar,m_str,;,/,读取文档内容,例,12-1,小结:,步骤 类 函数与变量,创建,SDI,工程,T11-1,创建对话框资源,CInput,m_input,声明文档类成员变量,T11-1Doc.h,m_str,初始化文档类成员变量,CT111Doc,OnNewDocument,增加菜单项与对话框关联,OnChange,文档数据的保存与读取,Serialize,视图输出显示,CT1
展开阅读全文