VC:使新的类支持串行化

 

STEP1:修改该类,从CObject 继承
class CGraph:public CObject

STEP2:实现void CGraph::Serialize(CArchive& ar)函数

STEP3:类中实现一个空的构造函数

STEP4:在类开始处增加支持串行化的宏 DECLARE_SERIAL(CGraph)

STEP5:定义类的版本号 IMPLEMENT_SERIAL(CGraph, CObject, 1 )

具体实现代码:
类定义:
class CGraph:public CObject
{
 DECLARE_SERIAL(CGraph)
public:
 void Draw(CDC* pDC);
 CPoint m_ptOrigin;
 CPoint m_ptEnd;
 UINT m_nDrawType;
 CGraph();
 CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd);
 void Serialize(CArchive& ar);
 virtual ~CGraph();

};

实现文件:
IMPLEMENT_SERIAL(CGraph, CObject, 1 )

CGraph::CGraph()
{

}

CGraph::CGraph(UINT m_nDrawType,CPoint m_ptOrigin,CPoint m_ptEnd)
{
 this->m_nDrawType=m_nDrawType;
 this->m_ptOrigin=m_ptOrigin;
 this->m_ptEnd=m_ptEnd;
}

CGraph::~CGraph()
{

}

void CGraph::Serialize(CArchive& ar)
{
 if(ar.IsStoring())
 {
  ar<<m_nDrawType<<m_ptOrigin<<m_ptEnd;
 }
 else
 {
  ar>>m_nDrawType>>m_ptOrigin>>m_ptEnd;
 }
}

void CGraph::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);
}

串行化保存数据:
 CClientDC dc(this);
 CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
 dc.SelectObject(pBrush);
 
 switch(m_nDrawType)
 {
 case 1:
  dc.SetPixel(point,RGB(0,0,0));
  break;
 case 2:
  dc.MoveTo(m_ptOrigin);
  dc.LineTo(point);
  break;
 case 3:
  dc.Rectangle(CRect(m_ptOrigin,point));
  break;
 case 4:
  dc.Ellipse(CRect(m_ptOrigin,point));
  break;
 }
 CGraph *pGraph=new CGraph(m_nDrawType,m_ptOrigin,point);
 //m_obArray.Add(pGraph);
 CGraphicDoc *pDoc=GetDocument();
 pDoc->m_obArray.Add(pGraph);
 
串行化读取数据:
 int nCount;
 //nCount=m_obArray.GetSize();
 nCount=pDoc->m_obArray.GetSize();
 for(int i=0;i<nCount;i++)
 {
  //((CGraph*)m_obArray.GetAt(i))->Draw(pDC);
  ((CGraph*)pDoc->m_obArray.GetAt(i))->Draw(pDC);
 } 

===========================================================

String Table中IDR_MAINFRAME字符串资源中各子串的含义
n(1)CDocTemplate::windowTitle,主窗口标题栏上的字符串,MDI程序不需要指定,将以IDR_MAINFRAME字符串为默认值。
n(2)CDocTemplate::docName,缺省文档的名称。如果没有指定,缺省文档的名称是无标题。
n(3)CDocTemplate::fileNewName,文档类型的名称。如果应用程序支持多种类型的文档,此字符串将显示在"File/New"对话框中。如果没有指定,就不能够在"File/New"对话框处理这种文件。
n(4)CDocTemplate::filterName,文档类型的描述和一个适用于此类型的通配符过滤器。这个字符串将出现在“File/Open”对话框中的文件类型列表框中。要和CDocTemplate::filterExt一起使用。
n(5)CDocTemplate::filterExt,文档的扩展名。如果没有指定,就不能够在“File/Open”对话框中处理这种文档。要和CDocTemplate::filterName一起使用。
n(6)CDocTemplate::regFileTypeId,如果你以::RegisterShellFileTypes向系统的注册表注册文件类型,此值会出现在HEY_CLASSES_ROOT之下成为其子项,并仅供Windows内部使用。如果没有指定,这种文件类型就无法注册。
n(7)CDocTemplate::regFileTypeName,这也是存储在注册表中的文件类型名称。它会显示于程序中用以访问注册表的对话框内。
 
 
Document/View结构
 
n在MFC中,文档类负责管理数据,提供保存和加载数据的功能。视类负责数据的显示,以及给用户提供对数据的编辑和修改功能。
nMFC给我们提供Document/View结构,将一个应用程序所需要的“数据处理与显示”的函数空壳都设计好了,这些函数都是虚函数,我们可以在派生类中重写这些函数。有关文件读写的操作在CDocument的Serialize函数中进行,有关数据和图形显示的操作在CView的OnDraw函数中进行。我们在其派生类中,只需要去关注Serialize和OnDraw函数就可以了,其它的细节我们不需要去理会,程序就可以良好地运行。
n当我们按下“File/Open”,Application Framework会激活文件打开对话框,让你指定文件名,然后自动调用CGraphicDoc::Serialize读取文件。Application Framework还会调用CGraphicView::OnDraw,传递一个显示DC,让你重新绘制窗口内容。
nMFC给我们提供Document/View结构,是希望我们将精力放在数据结构的设计和数据显示的操作上,而不要把时间和精力花费在对象与对象之间、模块与模块之间的通信上。
n一个文档对象可以和多个视类对象相关联,而一个视类对象只能和一个文档对象相关联。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值