【发布时间】:2014-12-14 23:02:02
【问题描述】:
我有一个程序,可以绘制形状:菱形、正方形、矩形、直线、圆形……在 Microsoft 中与 Paint 相同。 我的问题是使用 Serialize(CArchive &) 保存和加载文件,但使用 CArray 时无法保存和加载文件。我该怎么做:
class BaseShape : public CObject
{
DECLARE_SERIAL(BaseShape)
public:
CPoint topLeft, bottomRight;
COLORREF m_clrBack;
EShapeType m_ShapeType; //enum type of shape
public:
BaseShape(void); //empty method
BaseShape (CPoint , CPoint, COLORREF, EShapeType);
~BaseShape(void);
virtual void DrawShape (CDC*); //empty method
void Serialize(CArchive& ar);
};
实现BaseShape类的Serialize(CArchive&ar):
IMPLEMENT_SERIAL(BaseShape, CObject, 1)
void BaseShape::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar << topLeft << bottomRight << m_clrBack << m_ShapeType;
}
else
{
int temp_shape;
ar >> topLeft >> bottomRight >> m_clrBack >> temp_shape;
m_ShapeType = (EShapeType)temp_shape;
}
}
Square 类和 Lozenge 类是 BaseShape 派生的:
class CSquare : public BaseShape
{
public:
CSquare(void);
CSquare (CPoint , CPoint, COLORREF, EShapeType);
~CSquare(void);
void DrawShape(CDC*);
};
在 MFC 文档类中,我有:
//declare properties
CArray<BaseShape*, BaseShape*> m_arrShape;
COLORREF m_clrBack;
EShapeType m_ShapeType;
//implement method
void CdemoDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
int i;
ar << m_arrShape.GetSize();
for (i = 0; i <m_arrShape.GetSize(); i++)
ar << m_arrShape[i];
}
else
{
int ncount, i;
ar >> ncount;
m_arrShape.RemoveAll();
for (i = 0; i < ncount; i++)
{
BaseShape* pShape = new BaseShape();
ar >> pShape;
m_arrShape.Add(pShape);
}
在我的代码上面,当我点击打开文件时,没有显示之前绘制的形状,虽然我的代码没有错误,但我保存数据文件不确定是否成功。我不明白“isloading()”函数的代码行是如何工作的。还有另一种方法吗?这是我所有项目的源代码:http://www.mediafire.com/download/jy23ct28bgqybdc/demo.rar
【问题讨论】:
-
您实际上并没有告诉我们问题出在哪里。是编译问题、链接问题还是运行时问题?
-
我无法在 MFC 文档/视图应用程序中通过序列化 (CArchive &) 方法保存和加载文件。
-
但是具体是什么问题呢?你调试了吗?
-
是的,我有!我正在运行我的项目,它仍然绘制形状,但我无法加载文件,当我单击打开文件时保存了该文件
-
您可以下载我的项目进行调试
标签: c++ arrays visual-c++ serialization mfc