MFC中可以串行化的类必须满足以下条件
1 从CObject派生,或者间接派生
2 重写Serialize函数
3 使用DECLARE_SERIAL宏
4 定义不带参数的构造函数
5 在类的实现文件中用IMPLENT_SERIAL宏
在绘图保存的程序中,类CPaints作为保存的基本单元,它里面存储了绘图类型,起始点,终止点三个成员变量。
然后在绘图中每当绘制一幅图都会将CPaints作为保存对象,保存在View类的CObArray类型的变量中。
在文件保存中需要在Document类中保存View类中的m_obArray,加载的时候反之。
主要代码如下所示:
//Paints.h #pragma once // CPaints 命令目标 class CPaints : public CObject { public: CPaints(); virtual ~CPaints(); CPaints(UINT type,CPoint start,CPoint end); void Serialize(CArchive& ar); void Draw(CDC* pDC); private: UINT m_nDrawType; CPoint m_ptOrigin; CPoint m_ptEnd; DECLARE_SERIAL(CPaints) };
.............................................................................................................
//Paints.cpp // Paints.cpp : 实现文件 // #include "stdafx.h" #include "mfcArchive.h" #include "Paints.h" IMPLEMENT_SERIAL(CPaints,CObject,1) // CPaints CPaints::CPaints() { m_nDrawType = 0; } CPaints::~CPaints() { } // CPaints 成员函数 CPaints::CPaints(UINT type,CPoint start,CPoint end) { m_nDrawType = type; m_ptOrigin = start; m_ptEnd = end; } void CPaints::Serialize(CArchive& ar) { if(ar.IsStoring() ) { ar<<m_nDrawType<<m_ptOrigin<<m_ptEnd; } else { ar>>m_nDrawType>>m_ptOrigin>>m_ptEnd; } } void CPaints::Draw(CDC* pDC) { CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CBrush *pOldBrush = pDC->SelectObject(pBrush); switch(m_nDrawType) { case 1: pDC->SetPixel(m_ptEnd,RGB(0,0,0)); break; case 2: pDC->MoveTo(m_ptOrigin); pDC->LineTo(m_ptEnd); break; case 3: pDC->Rectangle(CRect(m_ptOrigin,m_ptEnd)); break; case 4: pDC->Ellipse(CRect(m_ptOrigin,m_ptEnd)); break; } pDC->SelectObject(pOldBrush); }
......................................................................................................
void CmfcArchiveDoc::Serialize(CArchive& ar) { POSITION ps = GetFirstViewPosition(); CmfcArchiveView* pView = (CmfcArchiveView*)GetNextView(ps); if (ar.IsStoring()) { // TODO: 在此添加存储代码 int a = 5; char b = 'c'; CString str("load test"); ar<<a<<b<<str; // int nCount = pView->m_obArray.GetSize(); ar<<nCount; for(int i=0;i<nCount;i++) { ar<<pView->m_obArray.GetAt(i); } } else { // TODO: 在此添加加载代码 int a; char b; CString str,strResult; ar>>a>>b>>str; strResult.Format("%d,%c,%s",a,b,str); //AfxMessageBox(strResult); int nCount; CPaints *ps; ar>>nCount; for(int i=0;i<nCount;i++) { ar>>ps; pView->m_obArray.Add(ps); } } }
............................................................................
void CmfcArchiveView::OnDraw(CDC* pDC) { CmfcArchiveDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 int nCount; nCount = m_obArray.GetSize(); for(int i=0;i<nCount;i++) { ( (CPaints*)m_obArray.GetAt(i) )->Draw(pDC); } }
时间: 2024-11-03 21:06:34