第24讲图形文件的保存和读取_第1页
第24讲图形文件的保存和读取_第2页
第24讲图形文件的保存和读取_第3页
第24讲图形文件的保存和读取_第4页
第24讲图形文件的保存和读取_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、2本讲主要内容图形文件的保存与读取3序列化绘图程序中的数据需要以文件的形式加以保存。在MFC应用程序中一般采用序列化的方法进行文档的读写。在绘图程序中有许多自定义类,如CLineType、CFill、CLine、CCurve、CRectangle等。为了使一个自定义类的对象具有持久性,必须让自定义类支持序列化。如果要保存的数据是文档派生类的数据成员,那么实现文档的序列化非常简单,只需要对序列化函数Serialize()进行完善。4自定义类的序列化但如果要让一个自定义类支持序列化,那么数据的存储和读取都要由自定义类自己去完成。5自定义类序列化的前提条件自定义类可序列化的前提条件是必须直接或间接地

2、从CObject派生,类都带有一个不带参数的构造函数,绘图程序中有关图形的自定义类都满足这两个条件。此外需要完成以下操作:要使用MFC序列化宏。在类的头文件中包含宏 DECLARE_SERIALIZE;在类的实现文件中包含宏IMPLEMENT_SERIAL;6自定义类序列化的前提条件自定义类必须重载序列化成员函数Serialize(),使其支持对自定义类的特定数据的序列化。并且,任何需要序列化的对象都应该在文档派生类中作为数据成员进行声明。7自定义类的序列化【例【例10-11】以例10-10的程序为基础,修改MyDrawSystem案例程序,使之具有序列化功能。【编程步骤编程步骤】(1) My

3、DrawSystem程序中涉及到序列化的自定义类有:线型类CLineType、填充类CFill、直线类CLine、自由曲线类CCurve、矩形类CRectangle。8自定义类的序列化按照序列化的条件,在上述五个类的声明头文件中添加函数Serialize()的声明和DECLARE_SERIAL 宏。其使用形式为: DECLARE_SERIAL( class_name ) DECLARE_SERIAL宏包括了DECLARE_DYNAMIC宏 和 DECLARE_DYNCREATE宏所具有的功能。9自定义类的序列化在上述五个类的实现文件中添加函数Serialize()的实现代码和IMPLEMENT

4、_SERIAL 宏。IMPLEMENT_SERIAL 宏的使用形式如下: IMPLEMENT_SERIAL( class_name, base_class_name, wSchema )其中参数wSchema为类对象版本号,使用大于或等于零的整数。如果要使Serialize成员函数能够读取多个版本(即,读取应用程序的不同版本写入的文件),可将VERSIONABLE_SCHEMA值作为IMPLEMENT_SERIAL宏的参数。10自定义类的序列化以CLine类为例,其头文件代码修改如下。#include LineType.hclass CLine : public CLineType DECLA

5、RE_SERIAL(CLine) public: virtual void Serialize(CArchive &ar); /重载序列化函数; 其余四个类的头文件同样处理11自定义类的序列化CLineType类的.cpp文件添加代码如下。/包含命令IMPLEMENT_SERIAL(CLineType, CObject, 0)void CLineType:Serialize(CArchive &ar) if(ar.IsStoring() ar m_nType m_nLineWidth m_nLineType m_nType m_nLineWidth m_nLineType m_

6、LineColor;12自定义类的序列化CFill类的.cpp文件添加代码如下。IMPLEMENT_SERIAL(CFill,CLineType,0)void CFill:Serialize(CArchive &ar)CLineType:Serialize(ar);if(ar.IsStoring()ar m_nFillPattern m_nFillPattern m_FillColor;13自定义类的序列化CLine类的.cpp文件添加代码如下。IMPLEMENT_SERIAL(CLine,CLineType, 0)void CLine:Serialize(CArchive &

7、ar) CLineType:Serialize(ar); if(ar.IsStoring()ar m_Begin m_Begin m_End ;14自定义类的序列化CCurve 类的.cpp文件添加代码如下。IMPLEMENT_SERIAL(CCurve,CLineType, 0)void CCurve:Serialize(CArchive &ar) CLineType:Serialize(ar);m_CurveArray.Serialize(ar);由于构成自由曲线的所有的点对象被保存到CArray类的对象中。CArray类属于集合类,所有的集合类都是从CObject类派生出来的,并

8、且集合类声明中都包含有DECLARE_SERIAL宏调用,因此可以通过调用集合类的Serialize成员函数,方便地完成集合的序列化。15自定义类的序列化CRectangle类的.cpp文件添加代码如下。IMPLEMENT_SERIAL(CRectangle,CFill, 0)void CRectangle:Serialize(CArchive &ar) CFill:Serialize(ar);if(ar.IsStoring()ar m_TopLeft m_TopLeft m_BottomRight ;16自定义类的序列化(2)在绘图过程中生成的每个图形对象都被加入到CObList类的对象m_FigureList(图元对象链表)中。CObList类属于集合类,所有的集合类都是从CObject类派生出来的,并且集合类声明中都包含有DECLARE_SERIAL宏调用,因此可以通过调用集合类的Serialize成员函数,方便地完成集合的序列化。在文档派生类文件MyDrawSystemDoc.cpp中添加代码如下。17自定义类的序列化void CMyDrawSystemDoc:Serialize(CArchive& ar) m_FigureList.Serialize(ar); /图元对象链表序列化 if (ar.IsStoring() / TODO: add s

温馨提示

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

评论

0/150

提交评论