MFC 序列化总结

来源:互联网 发布:淘宝怎么投诉未生产 编辑:程序博客网 时间:2024/05/29 03:47

问题如下:

需要一个能够自由画图的程序,比如可以自由画直线,圆,椭圆等图形。同时,在画完图形以后,可以保存即序列化。

个人认为难点:如何实现多个类的对象序列化到同一个文件。

思来想去最好的办法就是利用类的多态。

可以实现让直线,圆,椭圆都继承与Geometry类(自定义),利用多太将它们的操作统一。

代码如下:

class CLine : public Geometry 
{
private:
 POINT m_ptOrigin;
 POINT m_point;

public:
 DECLARE_SERIAL(CLine)

 CLine();
 CLine(const POINT pt1,const POINT pt2);
 void Serialize(CArchive& ar);
 POINT GetOriginalPoint();
 POINT GetNextPoint();
 bool Equal();
 virtual ~CLine();
 void Draw(CDC* pdc);
};

 

CPP文件中代码:

 CLine::CLine()
{

}

CLine::~CLine()
{

}

IMPLEMENT_SERIAL(CLine,CObject,1)
void CLine::Serialize(CArchive& ar)
{
 CString type="CLine";
 //读
 if (ar.IsStoring())
 {
  ar<<m_ptOrigin.x<<m_ptOrigin.y<<m_point.x<<m_point.y;
 }
 else
 {
  ar>>m_point.x>>m_point.y>>m_ptOrigin.x>>m_ptOrigin.y;
 }
}

void CLine::Draw(CDC* pdc)
{
 pdc->MoveTo(m_ptOrigin);
 pdc->LineTo(m_point);
}

CLine::CLine(const POINT pt1,const POINT pt2)
{
 m_ptOrigin.x=pt1.x;
 m_ptOrigin.y=pt1.y;
 m_point.x=pt2.x;
 m_point.y=pt2.y;
}

bool CLine::Equal()
{
 if (m_ptOrigin.x==m_point.x&&m_ptOrigin.y==m_point.y)
 {
  return true;
 }
 else
 {
  return false;
 }
}

POINT CLine::GetOriginalPoint()
{
 return m_ptOrigin;
}

POINT CLine::GetNextPoint()
{
 return m_point;
}

 

class CRound : public Geometry 
{
private:
 POINT Center;
 int Radius;
public:
 void Draw(CDC* pdc);
 void Serialize(CArchive &ar);
 CRound()
 {
  Center.x=0;
  Center.y=0;
  Radius=-1;
 }
 CRound(POINT center,int rad);
 virtual ~CRound();
 DECLARE_SERIAL(CRound)

 

 
};

CPP文件代码

IMPLEMENT_SERIAL(CRound,CObject,1)
void CRound::Serialize(CArchive& ar)
{
 //读
 if (ar.IsStoring())
 {
  ar<<Center.x<<Center.y<<Radius;
 }
 else
 {
  ar>>Center.x>>Center.y>>Radius;
 }
}

//构造函数
CRound::CRound(POINT cernter,int rad)
{
 this->Center=cernter;
 Radius=rad;
}

void CRound::Draw(CDC *pdc)
{
 //画圆
 pdc->Ellipse(Center.x-Radius,Center.y-Radius,Center.x+Radius,Center.y+Radius);
}

。。。。。。。

由子类Serialize重载基类,实现序列化。

 

原创粉丝点击