tft每日頭條

 > 圖文

 > mfc詳細教學

mfc詳細教學

圖文 更新时间:2024-10-06 02:00:46

圖形文件的保存和讀取

序列化

繪圖程序中的數據需要以文件的形式加以保存。在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

}

}

編譯、連接并運行程序,可以看到程序已經具有了序列化功能。

mfc詳細教學(初步帶你了解一下MFC)1

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved