標籤:可序列化的類
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)// CPaintsCPaints::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);}}