第17章 存储和打印文档
本章要点
序列化的工作方式
如何使类的对象可序列化
CArchive对象在序列化中的作用
如何在自己的类中实现序列化
如何在Sketcher应用程序中实现序列化
打印如何使用MFC
支持打印的视图类函数
CPrintInfo对象包含的内容及其在打印过程中的应用
如何在Sketcher应用程序中实现多页打印
利用目前在Sketcher程序中所完成的工作,可以创建一个相当全面、具有各种比例视图的文档,但是因为现在没有办法保存文档,所以信息是临时的。本章将解决这个问题,分析如何在磁盘上存储文档,以及如何把文档输出到打印机上。
17.1 了解序列化
在基于MFC的程序中,文档并非一个简单的实体--它可以是非常复杂的类对象。它通常包含各种对象,而这些对象又都可能包含其他对象,这些对象仍然又都可能包含其他对象……这种结构可能延续很多层次。
虽然希望能够把文档保存在文件中,但是将类对象写入文件意味着多少会有一些问题,因为类对象不同于整数或字符串这样的基本数据项。基本数据项由已知数目的字节组成,所以将它们写入文件只要求写入适当数目的字节。因此,如果已知一个int型的值写入了文件,那么在恢复它时,只需要读取适当数目的字节即可。
将对象写入文件则是另外一回事。即使是连续地写入一个对象的所有数据成员,这也不足以恢复原始对象。类对象包含函数成员以及数据成员,所有成员,包括数据成员和函数成员,都有访问说明符;因此,要在外部文件中记录对象,写入文件的信息必须包含所有类结构的完整规范。读取过程也必须非常智能,能够根据文件中的数据完整地组合成原始对象。MFC支持一种称为序列化的机制,它能够以最少的时间和精力,帮助实现类对象的输入和输出操作。
序列化的基本思想是任何可序列化的类都必须负责存储和检索自己。这意味着,要使类成为可序列化的--就Sketcher应用程序而言,这包括CElement类和派生于它的形状类--它们就必须能够将自己写入文件。这意味着要使一个类成为可序列化的,用于声明该类数据成员的所有类类型也必须是可序列化的。