第7章 文档与视图_第1页
第7章 文档与视图_第2页
第7章 文档与视图_第3页
第7章 文档与视图_第4页
第7章 文档与视图_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、第第 7 7 章章 文档与视图文档与视图 7.1 文档/视图结构 7.2 简单的文档/视图结构应用程序 7.3 文档的读写 7.4 分割视图窗口 7.5 多文档的应用程序 7.6 应用实例 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 2 7.1 文档文档/视图结构视图结构 为了统一和简化数据处理方法,为了统一和简化数据处理方法,microsoftmicrosoft公司公司 在在mfcmfc中提出了文档中提出了文档/ /视图结构的概念视图结构的概念。 把数据管理和显示方法分离开来,需要考虑把数据管理和显示方法分离开来,需要考虑: : 程序的哪一部

2、分拥有数据程序的哪一部分拥有数据 程序的哪一部分负责更新数据程序的哪一部分负责更新数据 如何以多种方式显示数据如何以多种方式显示数据 如何让数据的更改有一致性如何让数据的更改有一致性 如何储存数据如何储存数据( (放到永久储存装置上放到永久储存装置上) ) 如何管理使用者接口。如何管理使用者接口。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 3 7.1.1 7.1.1 概述概述 文档文档/ /视图结构的基本概念及创建过程。视图结构的基本概念及创建过程。 ( (以例以例 2.12.1为例为例) ) 1.1.文档文档(document)(docum

3、ent) 在文档在文档/ /视图结构中,文档是用来管理和组织数视图结构中,文档是用来管理和组织数 据的。据的。cdocumentcdocument类支持文档的标准操作,为了在应类支持文档的标准操作,为了在应 用程序中处理文档,首先应该从用程序中处理文档,首先应该从cdocumentcdocument类派生出类派生出 一个属于自己的文档类,并且在类中声明一些成员变一个属于自己的文档类,并且在类中声明一些成员变 量,用来存放数据;然后完成读取和修改文档数据的量,用来存放数据;然后完成读取和修改文档数据的 成员函数;最后再至少重载专门负责文件读写操作的成员函数;最后再至少重载专门负责文件读写操作的

4、serialize( )serialize( )函数。函数。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 4 在使用在使用mfc创建新的应用程序框架时,创建新的应用程序框架时,appwizard 准备好了文档类的空壳,下面是应用程序准备好了文档类的空壳,下面是应用程序li2_1中文档类中文档类 的定义的部分代码:的定义的部分代码: / li2_1doc.h : interface of the cli2_1doc class class cli2_1doc : public cdocument/派生出一个属于自己的派生出一个属于自己的文档类文档

5、类 protected: cli2_1doc(); declare_dyncreate(cli2_1doc) public: virtual bool onnewdocument(); virtual void serialize(carchive /专门负责文件专门负责文件i/o的函数的函数 ; visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 5 2视图视图 (view) 在文档在文档/视图结构中,视图的作用是显示和编视图结构中,视图的作用是显示和编 辑文档数据,提供用户与文档数据的交互接口。视辑文档数据,提供用户与文档数据的交互接口。视 图在图

6、在mfc的的cview类里类里被实例化被实例化。 在开发应用程序时,应该从在开发应用程序时,应该从cview类派类派生出一生出一 个属于自己的视图类,并且在类中至少改写专门负个属于自己的视图类,并且在类中至少改写专门负 责显示数据的责显示数据的ondraw()函数或函数或onprint()函数函数。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 6 class cli2_1view : public cview /派生出一个属于自己的视图类派生出一个属于自己的视图类 protected: / create from serialization o

7、nly cli2_1view(); declare_dyncreate(cli2_1view) public: cli2_1doc* getdocument(); /得到与之相关联的文档对象的指针得到与之相关联的文档对象的指针 public: virtual void ondraw(cdc* pdc); / 负责显示数据的负责显示数据的ondraw()函数函数 virtual bool precreatewindow(createstruct protected: virtual bool onprepareprinting(cprintinfo* pinfo); virtual void o

8、nbeginprinting(cdc* pdc, cprintinfo* pinfo); virtual void onendprinting(cdc* pdc, cprintinfo* pinfo); public: virtual cli2_1view(); ; visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 7 cview类和它的类和它的9个派生类封装了视图的各种不个派生类封装了视图的各种不 同的功能,它们为用户实现最新的同的功能,它们为用户实现最新的windows特性提特性提 供了很大的便利。这些派生视图类也可以作为用户程供了很大的便利。这

9、些派生视图类也可以作为用户程 序中视图类的基类,而将这些视图类设置为基类的最序中视图类的基类,而将这些视图类设置为基类的最 基本的方法是在基本的方法是在mfc appwizard创建创建sdi/mdi的第的第6 步中进行基类的选择。这些视图类如下表所示。步中进行基类的选择。这些视图类如下表所示。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 8 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 9 frame窗口负责文档与视图的界面管理,当窗口负责文档与视图的界面管理,当 frame窗口关闭时,在其中的

10、视图也被自动删除。窗口关闭时,在其中的视图也被自动删除。 下图说明了文档、视图、框架窗口之间的关系。下图说明了文档、视图、框架窗口之间的关系。 3. 框架框架 (frame) 窗口窗口 一个视图只一个视图只 能拥有一个能拥有一个 文档,但一文档,但一 个文档可以个文档可以 同时拥有多同时拥有多 个视图。个视图。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 10 4.4.文档模板文档模板(document template)(document template) 文档模板定义了文档、视图和框架窗口这文档模板定义了文档、视图和框架窗口这3 3个类的

11、个类的 关系。关系。 mfcmfc提供了一个文档模板类提供了一个文档模板类cdoctemplatecdoctemplate支持文档支持文档 模板。文档模板类是一个抽象的基类,它定义了文档模模板。文档模板类是一个抽象的基类,它定义了文档模 板的基本处理函数接口。由于它是一个抽象基类,因此板的基本处理函数接口。由于它是一个抽象基类,因此 不能直接用它来定义对象而必需用它的派生类。对一个不能直接用它来定义对象而必需用它的派生类。对一个 单文档界面程序,使用单文档界面程序,使用csingledoctemplatecsingledoctemplate类,类,而对于而对于 一个多文档界面程序,使用一个多文

12、档界面程序,使用cmultipledoctemplatecmultipledoctemplate类。类。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 11 5 5文档文档/ /视图结构的产生视图结构的产生 一般在应用程序的初始化函数一般在应用程序的初始化函数initinstanceinitinstance()() 中创建一个和多个文档模板。中创建一个和多个文档模板。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 12 bool cli2_1app:initinstance() csingledoc

13、template* pdoctemplate; pdoctemplate = new csingledoctemplate( idr_mainframe, runtime_class(cli2_1doc), runtime_class(cmainframe), runtime_class(cli2_1view); adddoctemplate(pdoctemplate); visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 13 文档文档/视图结构的创建过程如下图所示。视图结构的创建过程如下图所示。 visual c+程序设计与应用教程2021/5/2

14、5 第第7 7章章 文档与视图文档与视图 14 7.1.2 文档与视图之间的相互作用文档与视图之间的相互作用 文档与视图的交互是通过类的公有成员变量和文档与视图的交互是通过类的公有成员变量和 成员函数实现的成员函数实现的。 1 1视图类视图类cviewcview的成员函数的成员函数getdocumentgetdocument()() 一个视图对象只有一个与之相关联的文档对象。一个视图对象只有一个与之相关联的文档对象。 在在mfcmfc应用程序中,视图对象通过调用成员函数应用程序中,视图对象通过调用成员函数 getdocumentgetdocument()()得到与之相关联的文档对象的指针,得到

15、与之相关联的文档对象的指针, 利用这个指针就可以访问文档类及其派生类的公有利用这个指针就可以访问文档类及其派生类的公有 数据成员和成员函数。数据成员和成员函数。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 15 2 2cdocumentcdocument类的成员函数类的成员函数updateallviews()updateallviews() 一个文档对象可以有多个与之相关联的视图一个文档对象可以有多个与之相关联的视图 对象,但一个文档对象只反映当前视图的变化。对象,但一个文档对象只反映当前视图的变化。 当一个文档数据通过某个视图被修改后,与它关

16、当一个文档数据通过某个视图被修改后,与它关 联的每一个视图都必须反映出这种修改。因此,联的每一个视图都必须反映出这种修改。因此, 视图在需要时必须进行重绘,即当文档数据发生视图在需要时必须进行重绘,即当文档数据发生 改变时,必须通知所有相关联的视图对象,以便改变时,必须通知所有相关联的视图对象,以便 更新所显示的数据。更新与该文档有关的所有视更新所显示的数据。更新与该文档有关的所有视 图的方法是调用成员函数图的方法是调用成员函数 cdocument:updateallviews()。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 16 3 3视图

17、类的成员函数视图类的成员函数onupdate()onupdate() 当应用程序调用当应用程序调用cdocument:updateallviewscdocument:updateallviews()()函函 数时,实际上是调用了所有相关视图的数时,实际上是调用了所有相关视图的onupdateonupdate()()函函 数,以更新相关的视图。需要时,可以直接在视图派数,以更新相关的视图。需要时,可以直接在视图派 生类的成员函数中调用该函数刷新当前视图。另外,生类的成员函数中调用该函数刷新当前视图。另外, 在初始化视图成员函数在初始化视图成员函数cview:oninitialupdatecvie

18、w:oninitialupdate()()中中 也调用了也调用了onupdateonupdate()()函数函数。 刷 新 视 图 时 默 认 的 函 数 调 用 过 程 是 :刷 新 视 图 时 默 认 的 函 数 调 用 过 程 是 : cdocument:updateallviews()cview:onupdatecdocument:updateallviews()cview:onupdate()() cwnd:invalidate()onpaint()ondrawcwnd:invalidate()onpaint()ondraw()()。 visual c+程序设计与应用教程2021/5

19、/25 第第7 7章章 文档与视图文档与视图 17 4 4cviewcview类的类的oninitialupdate()oninitialupdate()函数函数 当应用程序被启动,或用户从当应用程序被启动,或用户从“文件文件”菜单中选择菜单中选择 了了 “ 新 建新 建 ” 或或 “ 打 开打 开 ” 命 令 时 ,命 令 时 , c v i e wc v i e w 的的 oninitialupdateoninitialupdate()()函数会被调用,该函数是虚函数函数会被调用,该函数是虚函数。 还可以利用派生类的还可以利用派生类的oninitialupdateoninitialupda

20、te()()函数对视函数对视 图对象进行初始化。当应用程序启动后,应用程序框架图对象进行初始化。当应用程序启动后,应用程序框架 在调用了在调用了oncreateoncreate()()函数后函数后( (如果对如果对oncreateoncreate()()函数进函数进 行了映射行了映射) ),会立即调用,会立即调用oninitialupdateoninitialupdate()()函数。函数。 oncreateoncreate()()函数只能被调用一次,而函数只能被调用一次,而oninitialupdateoninitialupdate()() 函数则可以被调用多次函数则可以被调用多次。 vis

21、ual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 18 7.1.3 7.1.3 使用文档视图结构的意义使用文档视图结构的意义 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 19 文档视图结构带来的好处主要有文档视图结构带来的好处主要有: 首先是将数据操作和数据显示、用户界面分离开首先是将数据操作和数据显示、用户界面分离开 mfc在文档在文档/视图结构上提供了许多标准操作界面,视图结构上提供了许多标准操作界面, 包括新建文件、打开文件、保存文件、打印等,减轻包括新建文件、打开文件、保存文件、打印等,减轻 了用户

22、的工作量了用户的工作量 支持打印预览和电子邮件发送功能支持打印预览和电子邮件发送功能 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 20 7.2 7.2 简单的文档简单的文档/ /视图结构应用程序视图结构应用程序 一般的,类的数据成员的初始化都是在构造一般的,类的数据成员的初始化都是在构造 函数中完成的,在构造函数调用结束时对象才真函数中完成的,在构造函数调用结束时对象才真 正存在。但对于文档来说却不同,文档类的数据正存在。但对于文档来说却不同,文档类的数据 成员初始化工作是在成员初始化工作是在onnewdocumentonnewdocument

23、()()成员函数成员函数 中完成的。中完成的。 7.2.1 文档中数据的初始化文档中数据的初始化 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 21 7.2.2 7.2.2 文档中数据的清理文档中数据的清理 同文档的初始化类似,文档的清理也不是在文档同文档的初始化类似,文档的清理也不是在文档 的析构函数中完成,而是在文档的的析构函数中完成,而是在文档的deletecontentsdeletecontents()() 成员函数中完成的成员函数中完成的。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 2

24、2 7.2.3 7.2.3 简单的文档简单的文档/ /视图结构应用程序视图结构应用程序 【例【例7.17.1】编写一个单文档的应用程序】编写一个单文档的应用程序mydrawmydraw,程序,程序 运行后,当用户在客户区窗口按下鼠标左键时,以鼠运行后,当用户在客户区窗口按下鼠标左键时,以鼠 标所在位置为圆心绘圆。标所在位置为圆心绘圆。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 23 编译、链接并运行程序。在视图窗口中单击鼠标左编译、链接并运行程序。在视图窗口中单击鼠标左 键,就可以鼠标所在位置为圆心绘圆键,就可以鼠标所在位置为圆心绘圆。 绘制

25、的图形符合题目要求,绘制的图形符合题目要求, 但当改变窗口大小或将窗口但当改变窗口大小或将窗口 最小化后再重新打开,原来最小化后再重新打开,原来 的圆没有显示出来。其原因的圆没有显示出来。其原因 是此时调用的是视图类的刷是此时调用的是视图类的刷 新函数新函数ondrawondraw()(),而在该函,而在该函 数中并没有实现绘圆功能。数中并没有实现绘圆功能。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 24 为了避免上述情况的发生,必须在为了避免上述情况的发生,必须在ondrawondraw()()函数函数 中重绘以前单击鼠标所绘制的圆,因此需

26、要将鼠标单中重绘以前单击鼠标所绘制的圆,因此需要将鼠标单 击时的坐标数据保存起来。击时的坐标数据保存起来。 下面的例下面的例7.27.2在文档类中定义一个大小为在文档类中定义一个大小为100100的的 pointspoints数组来保存圆心坐标数据。数组来保存圆心坐标数据。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 25 【例【例7.27.2】完善例】完善例7.17.1应用程序应用程序mydrawmydraw,在重绘窗口时能够,在重绘窗口时能够 显示已绘制的圆。显示已绘制的圆。 visual c+程序设计与应用教程2021/5/25 第第7

27、7章章 文档与视图文档与视图 26 7.2.4 7.2.4 集合类的使用集合类的使用 通常使用简单的数组或链表来存储集合数据。通常使用简单的数组或链表来存储集合数据。mfcmfc 提供了相应的集合类,来实现数组、列表和映象操作。提供了相应的集合类,来实现数组、列表和映象操作。 数组类类似于标准的数组类类似于标准的c c数组,允许使用下标访问和操作数组,允许使用下标访问和操作 数组元素,数组元素,mfcmfc数组类还可在需要时,动态地缩减和增数组类还可在需要时,动态地缩减和增 加数组所需的内存空间。加数组所需的内存空间。 列表类就是一个有序元素列表,提供用于在任意地方列表类就是一个有序元素列表,

28、提供用于在任意地方 插入和删除节点,向前、向后遍历元素的功能插入和删除节点,向前、向后遍历元素的功能。 映象类是使用关键字进行访问的对象的集合,类似于映象类是使用关键字进行访问的对象的集合,类似于 字典的组织方式,通过使用哈希字典的组织方式,通过使用哈希(hashing)(hashing)技术来使映技术来使映 象值与关键字配对,能实现对项目的快速访问象值与关键字配对,能实现对项目的快速访问。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 27 mfc提供了两种集合类提供了两种集合类: 基于模板的集合类基于模板的集合类 由这些集合类可以创建任何类型

29、的数组、列由这些集合类可以创建任何类型的数组、列 表和映象。为了使用这些类,必须在程序中包含头表和映象。为了使用这些类,必须在程序中包含头 文件文件“afxteml.h”。 非模板集合类非模板集合类 mfc提供了许多预定义的类,分别用来实现提供了许多预定义的类,分别用来实现 特定类型的数组、列表和映象。特定类型的数组、列表和映象。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 28 各个模板集合类的使用方法与对应的数组类、链表各个模板集合类的使用方法与对应的数组类、链表 类、映射类的使用方法相同,只需在定义具体的数组类类、映射类的使用方法相同,只

30、需在定义具体的数组类 对象或链表类对象、映射类对象时给模板实例化,指定对象或链表类对象、映射类对象时给模板实例化,指定 一个具体的类即可。一个具体的类即可。 例如下面的语句定义了一个例如下面的语句定义了一个cptrarraycptrarray类对象:类对象: cstringarray m_strtextcstringarray m_strtext 而下面的语句定义了一个而下面的语句定义了一个ctypedptrarrayctypedptrarray类对象:类对象: ctypedptrarraycptrarray,ccirclectypedptrarray m_circlearray m_circ

31、learray visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 29 【例【例7.37.3】编写一个单文档的应用程序】编写一个单文档的应用程序mycirclemycircle,利用,利用 数组类实现例数组类实现例7.27.2的功能。的功能。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 30 7.3 7.3 文档的读写文档的读写 mfc mfc中提供了一种读写文件的简单方法中提供了一种读写文件的简单方法 “序列化序列化”(即(即serialize serialize ,该函数为虚函数,该函数为虚函数)

32、。)。 序列化机制通过更高层次的接口功能向开发序列化机制通过更高层次的接口功能向开发 者提供了更利于使用和透明于字节流的文件操纵者提供了更利于使用和透明于字节流的文件操纵 方法方法。 序列化也叫串行化序列化也叫串行化。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 31 7.3.1 mfc mfc文档读写机制文档读写机制 1 1创建文档创建文档 2 2打开文档打开文档 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 32 3 3保存文档保存文档 visual c+程序设计与应用教程2021/5/25

33、第第7 7章章 文档与视图文档与视图 33 4 4关闭文档关闭文档 当用户试图关闭文档当用户试图关闭文档( (或退出应用程序或退出应用程序) )时,时, 应用程序会根据用户对文档的修改与否应用程序会根据用户对文档的修改与否 来进一来进一 步完成下列任务步完成下列任务: (1) (1) 若文档内容已被修改,则弹出一个消息对话若文档内容已被修改,则弹出一个消息对话 框,询问用户是否需要将文档保存。若用户选择框,询问用户是否需要将文档保存。若用户选择 “是是”,则应用程序执行,则应用程序执行onfilesaveonfilesave()()过程过程。 (2) (2) 调用调用cdocument:onc

34、losedocumentcdocument:onclosedocument()()虚函数虚函数 ,关闭所有与该文档相关联的文档窗口及相应的,关闭所有与该文档相关联的文档窗口及相应的 视图,调用文档类视图,调用文档类cdocumentcdocument的的deletecontentsdeletecontents()() 清除文档数据清除文档数据。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 34 序列化的基本思想是:序列化的基本思想是: 一个类应该能够对自己的成员变量的数据进行读写操一个类应该能够对自己的成员变量的数据进行读写操 作,对象可以通过

35、读操作而重新创建。即对象可以将其当作,对象可以通过读操作而重新创建。即对象可以将其当 前状态前状态( (由其成员变量的值表示由其成员变量的值表示) )写入永久性存储体写入永久性存储体( (通常通常 是指磁盘是指磁盘) )中,以后可以从永久性存储体中读取中,以后可以从永久性存储体中读取( (载入载入) )对对 象的状态,从而重建对象,类的对象自己应该具备将状态象的状态,从而重建对象,类的对象自己应该具备将状态 值写入磁盘或从磁盘中读出的方法值写入磁盘或从磁盘中读出的方法( (即成员函数即成员函数) ),这种对,这种对 象的保存和恢复的过程称为序列化。象的保存和恢复的过程称为序列化。 7.3.2

36、mfc7.3.2 mfc文档序列化文档序列化 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 35 mfc appwizard mfc appwizard向导生成的向导生成的seralizeseralize()()函数由一个函数由一个 if-elseif-else结构组成,例如应用程序结构组成,例如应用程序li7_1li7_1中有如下代码:中有如下代码: void cli7_1doc:serialize(carchive& ar) if(ar. isstoring ( ) ) /写数据写数据 / todo:add storing code here

37、. else /读数据读数据 / todo:add loading code here. visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 36 【例【例7.47.4】继续完善例】继续完善例7.27.2的应用程序的应用程序mydrawmydraw,以便,以便 能将绘制好的图形保存在磁盘上。能将绘制好的图形保存在磁盘上。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 37 7.3.3 7.3.3 自定义可序列化的类自定义可序列化的类 要让用户定义的类支持序列化,必须满足以下要让用户定义的类支持序列化,必须

38、满足以下5 5个条件:个条件: (1)(1)从从cobjectcobject类派生,这样派生类就具有类派生,这样派生类就具有rtti(run-time rtti(run-time type information)type information)、dynamic creationdynamic creation等功能等功能。 (2)(2)类的声明部分必须有类的声明部分必须有declare_serialdeclare_serial宏,此宏需要宏,此宏需要1 1 个参数:类名称。个参数:类名称。 (3)(3)类的实现部分必须有类的实现部分必须有implement_serialimplement_

39、serial宏,此宏需要宏,此宏需要 3 3个参数:一是类名称,二是基类名称,三是版本号。个参数:一是类名称,二是基类名称,三是版本号。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 38 (4) (4) 重新定义重新定义serialize( )serialize( )虚函数,使它能够适当地把虚函数,使它能够适当地把 类的成员变量写入文件中。类的成员变量写入文件中。 (5) (5) 为此类加上一个默认构造函数,这是因为如果一个为此类加上一个默认构造函数,这是因为如果一个 对象来自文件,对象来自文件,mfcmfc必须先动态地创建它,而且在没有必须先

40、动态地创建它,而且在没有 任何参数的情况下调用构造函数,然后才从文件中读取任何参数的情况下调用构造函数,然后才从文件中读取 对象数据。对象数据。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 39 【例【例7.57.5】完善例】完善例7.37.3的应用程序的应用程序mycirclemycircle,利用序列,利用序列 化来保存文件,并使自定义类支持序列化。化来保存文件,并使自定义类支持序列化。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 40 7.4 7.4 分割视图窗口分割视图窗口 分割窗口分为

41、两类:动态分割窗口和静态分割窗口。分割窗口分为两类:动态分割窗口和静态分割窗口。 动态分割窗口是指:用户可以动态的分割和除去分割动态分割窗口是指:用户可以动态的分割和除去分割 窗口,分割窗口会创建和删除相应的窗格。窗口,分割窗口会创建和删除相应的窗格。 静态分割窗口是指:在窗口创建时,分割窗口的窗格静态分割窗口是指:在窗口创建时,分割窗口的窗格 就已经创建好了,且窗格的数量和顺序不会改变。窗就已经创建好了,且窗格的数量和顺序不会改变。窗 格为一个分割条所分割,用户可以拖动分割条调整相格为一个分割条所分割,用户可以拖动分割条调整相 应的窗格的大小。应的窗格的大小。 visual c+程序设计与应

42、用教程2021/5/25 第第7 7章章 文档与视图文档与视图 41 7.4.1 csplitterwndcsplitterwnd类类 类类csplitterwndcsplitterwnd是是mfcmfc类库中实现分割窗口的基类库中实现分割窗口的基 类,根据需要可以从该类派生自己的分割窗口类类,根据需要可以从该类派生自己的分割窗口类。 分割窗口是含有多个窗格的窗口,每个窗格通常分割窗口是含有多个窗格的窗口,每个窗格通常 是应用程序特定的由是应用程序特定的由cviewcview派生类的对象,也可以是派生类的对象,也可以是 具有适当子窗口具有适当子窗口idid的任何的任何cwndcwnd对象对象。

43、 类类csplitterwndcsplitterwnd是类是类cwndcwnd的派生类的派生类。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 42 7.4.2 分割视图窗口的实现技术分割视图窗口的实现技术 1. 1. 动态分割窗口动态分割窗口 动态分割窗口是调用动态分割窗口是调用create()create()成员函数创建的,成员函数创建的, 通常用于创建和滚动同一文档的多个窗格或视图,此通常用于创建和滚动同一文档的多个窗格或视图,此 处窗格或视图属于同一个类的窗格或视图。处窗格或视图属于同一个类的窗格或视图。 visual c+程序设计与应用

44、教程2021/5/25 第第7 7章章 文档与视图文档与视图 43 【例【例7.67.6】 创建一个一行两列窗格的动态分割窗口创建一个一行两列窗格的动态分割窗口 的单文档应用程序的单文档应用程序li7_6li7_6。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 44 2 2静态分割窗口静态分割窗口 静态分割窗口是调用静态分割窗口是调用createstaticcreatestatic()()成员函数创建成员函数创建 的,通常用于创建同一文档的多个不同窗格或视图,而的,通常用于创建同一文档的多个不同窗格或视图,而 这里的多个窗格或视图往往是属于不同

45、类,这些窗格在这里的多个窗格或视图往往是属于不同类,这些窗格在 我 们 创 建 分 割 器 时 就 必 须 各 个 创 建 , 通 常 使 用我 们 创 建 分 割 器 时 就 必 须 各 个 创 建 , 通 常 使 用 createviewcreateview()()函数创建窗格。函数创建窗格。 visual c+程序设计与应用教程2021/5/25 第第7 7章章 文档与视图文档与视图 45 【例【例7.77.7】创建一个一行两列窗格的静态分割窗口的单文档】创建一个一行两列窗格的静态分割窗口的单文档 应用程序应用程序li7_7li7_7,其中左窗格是一个,其中左窗格是一个cformviewcformview格式视用于选格式视用于选 择画线、矩形、圆,右窗格是一个择画线、矩形、圆,右窗格是一个cviewcview视响应这些选择用视响应这些选择用 于画线、矩形、圆,如图于画线、矩形、圆,如图7.107

温馨提示

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

评论

0/150

提交评论