基于文档视图结构的程序.ppt
《基于文档视图结构的程序.ppt》由会员分享,可在线阅读,更多相关《基于文档视图结构的程序.ppt(68页珍藏版)》请在三一办公上搜索。
1、第九讲 基于文档/视图结构的程序,中国地质大学(武汉)计算机学院,计算机高级语言(C+),本章内容 主要包括建立基于文档/视图结构的应用程序方法,文档/视图结构应用程序的组成类及在应用程序架构中的作用,文档类CDocument与视图CView类,建立从CObject派生的类并实现对象的序列化操作。要求了解建立文档/视图结构应用程序的方法、应用程序向导创建的三种应用程序类型、VC中对单链表的处理。以Word为例,熟悉MDI应用程序中各个窗口所对应的类是什么,掌握文档类和视图类的常见成员函数、文档类和视图类的交互,熟练掌握VC中自定义类的持久化处理方法。,教学要点,9.1文档/视图结构9.2框架视
2、图的容器9.3文档管理和组织数据9.4视图显示文档数据,提供用户接口,本章内容,9.1文档/视图结构,文档视图结构是在VC中使用MFC开发基于文档应用程序的基本框架,在这个框架中,数据的维护及其显示分别由两个不同的,但又彼此紧密相关的对象文档和视图负责的。文档对象通常代表应用程序中打开的一个文件,而视图窗口则提供了该文档对象中数据的可视化表示形式并接收用户的交互。文档和视图关系是一对多的关系,即一个文档可以对应多个视图(如一个Word文档有大纲视图、页面视图、Web板式视图等),但一个视图只能对应一个文档。,9.1.1VC开发的应用程序类型9.1.2文档/视图结构程序的主要组成类 9.1.3从
3、程序员角度看SDI与MDI应用程序 9.1.4应用程序类 9.1.5文档/视图结构优点,9.1.1VC开发的应用程序类型,利用MFC应用程序向导可以开发三种类型的应用程序:第一种是基于对话框的应用程序,上一章讲的对话框与控件大部分是基于对话框的应用程序。第二种是基于SDI(Single Document Interface单文档接口)的应用程序,其特点是用户一次只能打开一个文档,若已经打开一个文档,想打开另一个文档时,必须关闭当前打开的文档。第三种基于MDI(Multi Document Interfac多文档接口)的应用程序,其特点是用户一次可以打开多个文档,若已经打开一个文档,又想打开另一
4、个文档时,不必关闭当前打开的文档,它体现了Windows操作系统的多任务特点。,9.1.2 文档/视图结构程序的主要组成类,1文档/视结构概述 在MFC 应用程序中,文档视图结构用来将程序的数据本身(靠CDocument类来管理)与数据的显示以及用户对数据的交互(靠CView类来管理)相隔离,这种模式与数据库系统中的“表/视图”关系相似。2SDI应用程序的组成类 单文档应用程序是一种比较简单的基于文档/视图结构的程序,程序在运行过程中,只能打开该程序所关联的(如Word子处理程序关联的的是.Doc文件,即双击某个.Doc文件,启动它的是Word程序)一个文件。3MDI应用程序的组成类 多文档应
5、用程序是一种比较复杂的基于文档/视图结构程序,程序在运行过程中,可以打开该程序所关联的(如Excel电子表格处理程序关联的的是.xls文件,即双击某个.xls文件,启动它的是Excel程序)多个文件。,【例9-1】本实例实现一个简单的文本编辑器功能。它是基于单文档的应用程序。,(1)实例创建步骤 创建一个新的MFC AppWizard(exe)工程,工程名称为MyEditor。在AppWizard的第一步中,选择类型为Single Document(单文档类型)。AppWizard的第二步、第三步中使用缺省的选项,在第四步中,单击Advance(高级)按钮,弹出Advance Options对
6、话框,在File Extension(文件扩展名)编辑框中输入txt2,如图所示。完后按Close按钮。,AppWizard的第五步使用缺省的选项,在第六步中,将CMyEditorView类的基类设置为CEditView后,按Close按钮关闭该对话框,在余下的几步中,全部使用默认值。最后单击“Finish”按钮,生成应用程序框架。(2)SDI应用程序的组成类 利用MFC AppWizard生成一个基于单文档的应用程序后,打开WorkSpace中的ClassView选项页,可以浏览到单文档应用程序的一些核心的组成类,如右图所示,理解这些类及其之间的关系是理解该类应用程序的关键。,【例9-1】(
7、续),向导生成的一个典型的单文档应用程序包括一个应用程序类CMyEditorApp、一个主框架窗口类CMainFrame、一个文档类CMyEditorDoc、一个视图类CMyEditorView、一个“关于”对话框类CAboutDlg。打开上述五个类的定义文件,可以看到,基于文档/视图结构的SDI应用程序至少由以下的几个类来组成:应用程序类CMyEditorApp是一个从CWinApp类派生的类,它充当全部应用程序的容器。框架窗口类CMainFrame是一个从CFrameWnd类派生的类。在SDI应用程序中,框架窗口就是应用程序的主窗口,主窗口就是应用程序直接放置于桌面上的那个窗口,每个应用程
8、序只能有一个主窗口,主窗口的标题栏上常常显示应用程序的名称(如在记事本程序中,新建一个文件后,主窗口的标题栏上显示“未定标题-记事本”)。,【例9-1】(续),文档类CMyEditorDoc是从CDocument类继承而来的类,它存储应用程序的数据,并将这些信息提供给应用程序的其余部分。视图类CMyEditorView是从CEditView类派生而来的,CEditView类提供了基本的文本编辑功能,是从CView类派生来的。视图窗口与其父窗口框架窗口的客户区域对齐,它接收用户对应用程序的输入并显示相关联的文档数据。对话框类CAboutDlg是从CDialog派生来的,该对话框类显示一个简单的版
9、本信息的“关于”对话框。对话框类的说明前面有一章已经专门讲解了。,【例9-1】(续),(3)运行SDI应用程序 编译并运行上述程序的显示结果如图所示。在客户区中输入一些文本,然后保存。再新建一个,刚才所输入内容的文件已经关闭。这是一个典型的单文档应用程序,看它是否和记事本程序的功能类似。,(4)保存文档 在MyEditor应用程序的客户区输入一些文本后,单击“文件|保存”,则弹出右图所示的“文件保存”对话框,将文件名编辑框中输入一个文件名如vc6,则在制定的目录下保存了一个vc9.txt2文件,其中保存类型编辑框中出现的的文字就是在前面向导中的设置所起的作用。,【例9-1】(续),另外,在Wi
10、ndow下,我们直接双击刚才建立的文件vc9.txt2,则该文件自动用程序MyEditor打开,和在Windows下用鼠标双击某个.doc文件,则该文件自动用Word字处理程序打开类似,该功能是怎样实现的呢?定位到应用程序类的InitInstance()函数中,可以看到下面的代码:,BOOL CMyEditorApp:InitInstance()CSingleDocTemplate*pDocTemplate;pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyEditorDoc),RUNTIME_CLASS(CM
11、ainFrame),/main SDI frame windowRUNTIME_CLASS(CMyEditorView);AddDocTemplate(pDocTemplate);/Enable DDE Execute openEnableShellOpen();/使得双击.txt2文件类型时能调用该工程MyEditor打开RegisterShellFileTypes(TRUE);/在注册表中注册文件类型.txt2/Parse command line for standard shell commands,DDE,file openCCommandLineInfo cmdInfo;Parse
12、CommandLine(cmdInfo);上述两行加红的代码的功能就是实现某种类型的文件与某个应用程序关联的语句,有了它就能在双击某种类型的文件时,调用相应的应用程序把其打开。,【例9-2】本实例实现一个丰富文本编辑功能,即可以在当前文档中插入其它的图形、音频等。它是基于多文档的应用程序。,(1)实例创建步骤 创建一个新的MFC AppWizard(exe)工程,工程名称为MyWord。在AppWizard的第一步中,选择类型为Multiple Documents(多文档类型)。AppWizard的第二步使用缺省的选项,在第三步中主要选择如何支持复合档支持 文档的,我们选择“Container
13、”容器支持,如下图所示,完后按Next按钮。,【例9-2】本实例实现一个丰富文本编辑功能,即可以在当前文档中插入其它的图形、音频等。它是基于多文档的应用程序。,AppWizard的第二步、第三步中使用缺省的选项,在第四步中,单击Advance(高级)按钮,弹出Advance Options对话框,在File Extension(文件扩展名)编辑框中输入doc2,如下图所示。完后按Close按钮。,AppWizard的第五步使用缺省的选项,在第六步中,将CMyWordView类的基类设置为CRichEditView后,按Close按钮关闭该对话框,在余下的几步中,全部使用默认值。最后单击“Fin
14、ish”按钮,生成应用程序框架。(2)MDI应用程序组成类 利用MFC AppWizard生成一个基于多文档的应用程序后,打开WorkSpace中的ClassView选项页,可以浏览到多文档应用程序的一些核心的组成类,如右图所示,理解这些类及其之间的关系是理解该类应用程序的关键。,【例9-2】(续),向导生成的一个典型的多文档应用程序包括一个应用程序类CMyWordApp、一个主框架窗口类CMainFrame、一个子框架窗口类CChildFrame、一个文档类CMyWordDoc、一个视图类CMyWordView、一个“关于”对话框类CAboutDlg。由于该程序可以是复合文档的容器,即该程序
15、可以嵌入别的应用程序对象,故该类中还有一个丰富文本条目类CMyWordCntrItem。打开上述七个类的定义文件,可以看到,基于文档/视图结构的MDI应用程序至少由以下的几个类来组成:1)应用程序类CMyWordApp是一个从CWinApp类派生的类,它充当全部应用程序的容器。,【例9-2】(续),2)框架窗口类CMainFrame是一个从CMDIFrameWnd类派生的类,在MDI应用程序中,框架窗口就是应用程序的主窗口,主窗口就是应用程序直接放置于桌面上的哪个窗口,每个应用程序只能有一个主窗口,主窗口的标题栏上常常显示应用程序的名称(如在记事本程序中,新建一个文件后,主窗口的标题栏上显示“
16、未顶定标题-记事本”)。3)子框架窗口类CChildFrame是一个从CMDIChildWnd类派生的类,在MDI应用程序中,子框架窗口是包含在MDI主窗口的一个子窗口,该子窗口不能有自己的菜单,但可以共享MDI主窗口的菜单。该窗口主要用来容纳视图窗口。,4)文档类CMyWordDoc是从CRichEditDoc类继承而来的类,而CRichEditDoc又是从CDocument继承而来的,它存储应用程序的数据(可以包含音频和视频数据,即可存储丰富文本),并将这些信息提供给应用程序的其余部分。5)视图类CMyWordView是从CRichEditView类派生而来的,CRichEditView类
17、提供了丰富的文本编辑功能(可以编辑图形图像数据,即可编辑丰富文本),它是从CView类派生来的。视图窗口与其父窗口框架子窗口的客户区域对齐,它接收用户对应用程序的输入并显示相关联的文档数据。6)对话框类CAboutDlg是从CDialog派生来的,该对话框类显示一个简单的版本信息的“关于”对话框类。,【例9-2】(续),(3)运行MDI应用程序 编译并运行上述程序,建立两个文档MyWord1与MyWord2,其中MyWord1中存储的是一个Excel图表,MyWord2中存储的是离散数学中的“一阶谓词公式”。这是一个典型的多文档应用程序,同时打开了两个文档。单击“窗口|平铺”菜单项(该功能我们
18、并没有编写代码,得益于MDI应用程序框架自动提供了该功能),则打开的两个文档视图平铺在框架窗口中,其显示的界面如下页图所表示,看它是否和Word字处理程序的功能类似。,【例9-2】(续),MyWord的运行结果,9.1.3 从程序员角度看SDI与MDI应用程序,从程序员的眼光看,每个MDI应用程序必须有一个CMDIFrameWnd或其派生类的对象,该窗口称做MDI框架窗口。CMDIFrameWnd是从CFrameWnd派生来的,它不仅继承了CFrameWnd类的全部特性外,还增加了一些与MDI相关的一些特性。,(1)与SDI不同,MDI框架窗口并不直接与一个文档和视图相关联,MDI框架窗口有其
19、自己的客户窗口,在显示或隐藏工具栏或状态栏时,重新定位该子窗口;(2)MDI客户窗口是MDI子窗口的直接父窗口,它负责管理主框架窗口(主应用程序窗口)的客户区(不包括菜单栏、工具栏、状态栏、滚动条的供客户使用的区域)以及创建子窗口。每个MDI主框架窗口有且仅有一个MDI客户窗口。(3)MDI子窗口是CMDIChildWnd或其派生类对象,CMDIChildWnd也是从CFrameWnd派生来的,主要用于容纳文档和视图,相当于SDI中的主框架窗口。每打开一个文档,主程序窗口就自动为该文档创建一个MDI子窗口。一个MDI应用程序负责动态地创建和删除MDI子窗口,在任何时候,最多只有一个子窗口是活动
20、的。,(4)在没有任何活动子窗口时,MDI的框架窗口可以有自己的默认菜单。当有活动的子窗口(打开的文档)时,MDI框架窗口的菜单会自动被子窗口菜单取代。框架窗口会自动监视当前活动文档窗口的类型,相应地改变框架窗口的菜单;(5)MDI框架窗口为层叠、平铺、排列和新建子窗口等一些标准的窗口操作提供了默认的菜单选项。用户单击文件下的“新建”命令时,框架窗口会调用CDocTemplate:CreateNewFrame()为当前的活动文档创建一个子窗口,该函数不仅创建子窗口(CMDIChildWnd类的对象),还创建与文档相对应的视图。,9.1.4应用程序类,1应用程序对象的声明 应用程序类CWinAp
21、p负责唯一的全局应用程序对象的创建、初始化、运行和退出清理过程。Windows应用程序有一个WinMain()函数,它是整个应用程序的起点。使用VC的应用程序架构创建的MFC程序已经封装了该函数。当程序被启动时,WinMain()被自动执行,进行一些标准的初始化工作,而把控制权转移给应用程序对象。应用程序类提供了如下的几个可超载的函数:初始化实例函数InitInstance()、处理消息的函数Run()、退出应用程序实例的函数ExitInstance()、空闲时间的处理函数OnIdle()。打开上述类图中的应用程序类CMyWord的实现文件,在其实例化函数InitInstance()前面有如下
22、的一行代码:CMyWordApp theApp;CMyWordApp是从CWinApp派生出来的应用程序类,theApp是该类的对象应用程序对象。它是一个全局变量,先于其它对象被创建。该类有一个很重要的函数InitInstance(),在该函数中创建一个文档模板,来管理文档/视图结构涉及的框架窗口、文档和视图。,2文档模板 文档模板负责在运行时动态创建文档、视图和框架窗口。一个应用程序对象可以管理一个或多个文档模板,每个文档模板用于动态创建和管理一个或多个同类型的文档(这取决于应用程序是SDI程序还是MDI程序)。MFC的文档模板类CDocTemplate用于支持文档模板操作,对于单文档界面程
23、序,应使用CSingleDocTemplate(单文档模板类),对于多文档界面程序,使用CMultipleDocTemplate(多文档模板类)。文档模板定义了文档、视图和框架窗口这三个类的关系。通过文档模板,可以知道在创建或打开一个文档时,需要用什么样的视图和框架窗口显示它。这是因为文档模板保存了文档及其对应视图和框架窗口的CRuntimeClass对象指针。,此外,文档模板还保存了所支持的全部文档类的信息,包括这些文档的文件扩展名信息、文档在框架窗口中的名字、代表文档的图标等信息。下面为在应用程序类中的实例化函数中创建文档模板的代码:CMultiDocTemplate*pDocTempla
24、te;/声明一个指向多文档模 板的指针变量pDocTemplate pDocTemplate=new CMultiDocTemplate(/创建多文档模板 IDR_MULTIDTYPE,RUNTIME_CLASS(CMyWordDoc),RUNTIME_CLASS(CChildFrame),/custom MDI child frame RUNTIME_CLASS(CMyWordView);AddDocTemplate(pDocTemplate);/将创建的文档模板添加到应用程序对象中,9.1.5文档/视图结构优点,文档视图结构重要的特征是数据操作与数据显示分离。由于数据操作与数据显示分别按标
25、准方法封装于两个不同类型的对象中,因而这两项任务的工作量都被大大简化了,各个对象单独存在,而不是将两种代码混在一起。一般说来,对那些有大量数据需要管理、或数据显示非常复杂的应用,文档视结构显得尤为有用。文档视图结构另一个重要特征是许多MFC类对公共的文档视图活动提供了大量的帮助。例如,对文件的操作(选择文件、打开文件和关闭文件)完全由框架类来管理。用户所需做的仅仅是从数据流中读写所需要的字节,这种工作方法可以省略相同代码的重复编写,而将更多的时间用于编写应用程序的特殊代码上。,9.2框架视图的容器,9.2.1 框架窗口的组成 9.2.2 框架窗口的创建和清除 9.2.3 框架窗口的子窗口 9.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 文档 视图 结构 程序
链接地址:https://www.31ppt.com/p-6559830.html