mfc编程是什么 mfc是什么

序列化
绘图程序中的数据需要以文件的形式加以保存 。在MFC应用程序中一般采用序列化的方法进行文档的读写 。
在绘图程序中有许多自定义类,如CLineType、CFill、CLine、CCurve、CRectangle等 。为了使一个自定义类的对象具有持久性,必须让自定义类支持序列化 。如果要保存的数据是文档派生类的数据成员,那么实现文档的序列化非常简单,只需要对序列化函数Serialize()进行完善 。
自定义类的序列化
但如果要让一个自定义类支持序列化,那么数据的存储和读取都要由自定义类自己去完成 。
自定义类序列化的前提条件
自定义类可序列化的前提条件是必须直接或间接地从CObject派生,类都带有一个不带参数的构造函数,绘图程序中有关图形的自定义类都满足这两个条件 。此外需要完成以下操作:
要使用MFC序列化宏 。在类的头文件中包含宏 DECLARE_SERIALIZE;在类的实现文件中包含宏IMPLEMENT_SERIAL;
自定义类必须重载序列化成员函数Serialize(),使其支持对自定义类的特定数据的序列化 。
并且,任何需要序列化的对象都应该在文档派生类中作为数据成员进行声明 。
自定义类的序列化
修改MyDrawSystem案例程序,使之具有序列化功能 。
【编程步骤】
(1) MyDrawSystem程序中涉及到序列化的自定义类有:线型类CLineType、填充类CFill、直线类CLine、自由曲线类CCurve、矩形类CRectangle 。
按照序列化的条件,在上述五个类的声明头文件中添加函数Serialize()的声明和DECLARE_SERIAL 宏 。
其使用形式为:
DECLARE_SERIAL( class_name )
DECLARE_SERIAL宏包括了DECLARE_DYNAMIC宏 和 DECLARE_DYNCREATE宏所具有的功能 。
在上述五个类的实现文件中添加函数Serialize()的实现代码和IMPLEMENT_SERIAL 宏 。IMPLEMENT_SERIAL 宏的使用形式如下:可以加下群466572167(群内有C/C++的学习资料以及各类型的项目学习资料)
IMPLEMENT_SERIAL( class_name,
base_class_name, wSchema )

mfc编程是什么 mfc是什么

文章插图
其中参数wSchema为类对象版本号,使用大于或等于零的整数 。如果要使Serialize成员函数能够读取多个版本(即,读取应用程序的不同版本写入的文件),可将VERSIONABLE_SCHEMA值作为IMPLEMENT_SERIAL宏的参数 。
以CLine类为例,其头文件代码修改如下 。
#include "LineType.h"
class CLine : public CLineType
{
DECLARE_SERIAL(CLine)
public:
……
virtual void Serialize(CArchive &ar);
//重载序列化函数
};
注意:其余四个类的头文件同样处理
CLineType类的.cpp文件添加代码如下 。
……//包含命令
IMPLEMENT_SERIAL(CLineType, CObject, 0)
void CLineType::Serialize(CArchive &ar)
{
if(ar.IsStoring())
ar << m_nType << m_nLineWidth << m_nLineType
<< m_LineColor;
else
ar >> m_nType >> m_nLineWidth >> m_nLineType
>> m_LineColor;
}
CFill类的.cpp文件添加代码如下 。
IMPLEMENT_SERIAL(CFill,CLineType,0)
void CFill::Serialize(CArchive &ar)
【mfc编程是什么 mfc是什么】{
CLineType::Serialize(ar);
if(ar.IsStoring())
ar << m_nFillPattern << m_FillColor;
else
ar >> m_nFillPattern >> m_FillColor;
}
CLine类的.cpp文件添加代码如下 。
IMPLEMENT_SERIAL(CLine,CLineType, 0)
void CLine::Serialize(CArchive &ar)
{
CLineType::Serialize(ar);
if(ar.IsStoring())
ar << m_Begin << m_End ;
else
ar >> m_Begin >> m_End ;
}
CCurve 类的.cpp文件添加代码如下 。
IMPLEMENT_SERIAL(CCurve,CLineType, 0)
void CCurve::Serialize(CArchive &ar)
{
CLineType::Serialize(ar);
m_CurveArray.Serialize(ar);
}
注意:由于构成自由曲线的所有的点对象被保存到CArray类的对象中 。CArray类属于集合类,所有的集合类都是从CObject类派生出来的,并且集合类声明中都包含有DECLARE_SERIAL宏调用,因此可以通过调用集合类的Serialize成员函数,方便地完成集合的序列化 。可以加下群466572167(群内有C/C++的学习资料以及各类型的项目学习资料)

秒懂生活扩展阅读