圖形文件的保存和讀取
序列化
繪圖程序中的數據需要以文件的形式加以保存。在MFC應用程序中一般采用序列化的方法進行文檔的讀寫。
在繪圖程序中有許多自定義類,如CLineType、CFill、CLine、CCurve、CRectangle等。為了使一個自定義類的對象具有持久性,必須讓自定義類支持序列化。如果要保存的數據是文檔派生類的數據成員,那麼實現文檔的序列化非常簡單,隻需要對序列化函數Serialize()進行完善。
自定義類的序列化
但如果要讓一個自定義類支持序列化,那麼數據的存儲和讀取都要由自定義類自己去完成。
自定義類序列化的前提條件
自定義類可序列化的前提條件是必須直接或間接地從CObject派生,類都帶有一個不帶參數的構造函數,繪圖程序中有關圖形的自定義類都滿足這兩個條件。此外需要完成以下操作:
要使用MFC序列化宏。在類的頭文件中包含宏 DECLARE_SERIALIZE;在類的實現文件中包含宏IMPLEMENT_SERIAL;
自定義類必須重載序列化成員函數Serialize(),使其支持對自定義類的特定數據的序列化。
其中參數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)
{
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 的學習資料以及各類型的項目學習資料)
CRectangle類的.cpp文件添加代碼如下。
IMPLEMENT_SERIAL(CRectangle,CFill, 0)
void CRectangle::Serialize(CArchive &ar)
{
CFill::Serialize(ar);
if(ar.IsStoring())
ar << m_TopLeft << m_BottomRight ;
else
ar >> m_TopLeft >> m_BottomRight ;
}
(2)在繪圖過程中生成的每個圖形對象都被加入到CObList類的對象m_FigureList(圖元對象鍊表)中。
CObList類屬于集合類,所有的集合類都是從CObject類派生出來的,并且集合類聲明中都包含有DECLARE_SERIAL宏調用,因此可以通過調用集合類的Serialize成員函數,方便地完成集合的序列化。可以加下群466572167(群内有C/C 的學習資料以及各類型的項目學習資料)
在文檔派生類文件MyDrawSystemDoc.cpp中添加代碼如下。
void CMyDrawSystemDoc::Serialize(CArchive& ar)
{
m_FigureList.Serialize(ar); //圖元對象鍊表序列化
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
編譯、連接并運行程序,可以看到程序已經具有了序列化功能。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!