MFC 之支援序列化的類

來源:互聯網
上載者:User

標籤:可序列化的類

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);}}



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.