vc序列化问题(2)

2019-06-17 12:16

以下示例显示了如何通过存档将对象存储在文件中: // todo: add loading code here carchive ar(&thefile, carchive::store); word wemployeeid; ...

ar << wemployeeid;

void cperson:serialize(carchive& ar)

从先前存储在文件中的值加载对象

{

以下示例显示了如何从先前存储在文件中的值加载对象:

if (ar.isstoring())

carchive ar(&thefile, carchive::load);

{

word wemployeeid;

ar << m_strname;

...

ar << m_wage;

ar >> wemployeeid;

} } }

上面的代码模板与 appwizard 为该文档(从 cdocument 派生的类)的 s总是并行,该代码模板有助于写的代码更容易复查,如下例中所示:

通常,通过 cobject 派生类的 serialize 函数中的存档将数据存储到文件中或从文件中加载数据,必须已用 declare_serializ件中加载数据或将数据存储到文件中。

{

可序列化的 cobject 派生类的 serialize 函数通常具有以下形式:

ar >> m_strname;

void cperson::serialize(carchive& ar)

ar >> m_wage;

{

}

cobject::serialize(ar);

}

if (ar.isstoring()) {

cobject*

// todo: add storing code here } else {

size 和 csize float word cstring

point 和 cpoint dword

些函数。将 carchive 对象的引用传递到 serialize 函数。调用 else carchive 对象的 isloading 函数以确定是否已调用 serializ

库将 carchive 的“ << ”和“ >> ”运算符定义为第一操作数,将下列

byte

rect 和 crect double long

ctime 和 ctimespan int

colecurrency colevariant

coledatetime coledatetimespan

l 在 view 类中添加对控件的响应,实现画图功能,每次鼠标弹l 保存文件(通过 doc 的 serialize 来保存数据)

l 打开文件(通过 doc 的 serialize 来读取数据,并将其重绘在 view 类中定义 cobarray m_obarray;

下面按这个思路来完成:(在 c graph 子类中完成重绘的画图功能) graph.cpp

#include \#include \

implement_serial(cgraph, cobject, 1 )

cgraph::cgraph(void)

注意 通过存档存储及加载 cobjects 需要额外注意。有关更多信息,请参见通过存档存储和加载 cobjects 。

: m_ptorigin(0)

carchive 的“ << ”和“ >> ”运算符总是返回 carchive 对象的引用,该引用为第一操作数。这使您可以链接运算符,如下所

, m_ptend(0)

byte bsomebyte;

, m_ndrawtype(0)

word wsomeword;

{

dword wsomedoubleword;

}

...

cgraph::cgraph(cpoint m_ptorigin,cpoint m_ptend,uint m_ndrawtype

ar << bsomebyte << wsomeword << wsomedoubleword;

{

this->m_ptorigin=m_ptorigin;

this->m_ptend=m_ptend;

通过存档存储及加载 cobject (见前)

this->m_ndrawtype=m_ndrawtype;

下面用一个示例来解释这个问题。

}

目标:一个画图程序,通过保存打开按钮存取图片。方法:保存图片绘制信息。

cgraph::~cgraph(void)

按步骤:

{

l 创建可序列化的类 ->graph.cpp+graph.h

}

void cgraph::serialize( carchive& ar ) {

// 继承基类的cobject cobject::serialize( ar ); if( ar.isstoring() ) {

case 2:

pdc->moveto(m_ptorigin); pdc->lineto(m_ptend); break; case 3:

pdc->rectangle(crect(m_ptorigin,m_ptend)); break;

ar << m_ptorigin << m_ptend << m_ndrawtype ; case 4: } else {

pdc->ellipse(crect(m_ptorigin,m_ptend)); break; }

ar >> m_ptorigin >> m_ptend >> m_ndrawtype ; pdc->selectobject(poldbrush); } }

void cgraph::draw(cdc* pdc) {

} graph..h #pragma once

#include \

cbrush *pbrush=cbrush::fromhandle((hbrush)getstockobject(null_brush)); cbrush *poldbrush=pdc->selectobject(pbrush); class cgraph : publiccobject switch(m_ndrawtype) { case 1:

pdc->setpixel(m_ptend,rgb(0,0,0)); break;

{ public :

declare_serial( cgraph ) cgraph(void);

cgraph::cgraph(cpoint m_ptorigin,cpoint m_ptend,uint m_ndra

void serialize( carchive& ar ); ~cgraph(void); cpoint m_ptorigin; cpoint m_ptend; uint m_ndrawtype; void draw(cdc* pdc); };

在 view 类中添加画图功能 void cgraphicserialview::ondot() {

// todo: 在此添加命令处理程序代码 m_ndrawtype=1; }

void cgraphicserialview::online() {

// todo: 在此添加命令处理程序代码 m_ndrawtype=2; }

void cgraphicserialview::onrectangle() {

// todo: 在此添加命令处理程序代码

m_ndrawtype=3; }

void cgraphicserialview::onellipse() {

// todo: 在此添加命令处理程序代码 m_ndrawtype=4; }

void cgraphicserialview::onlbuttondown(uint nflags, cpoint point{

// todo: 在此添加消息处理程序代码和/或调用默认值 m_ptorigin = point;

cview::onlbuttondown(nflags, point); }

void cgraphicserialview::onlbuttonup(uint nflags, cpoint point) {

// todo: 在此添加消息处理程序代码和/或调用默认值 cclientdc dc(this);

cbrush *pbrush=cbrush::fromhandle((hbrush)getstockobject(nu dc.selectobject(pbrush);

switch(m_ndrawtype) { case 1:

dc.setpixel(point,rgb(0,0,0)); break; case 2:

dc.moveto(m_ptorigin);

但是要保存和读取文件需要用到 serialize 因此转到 doc 类

void cgraphicserialdoc::serialize(carchive& ar) {

position pos=getfirstviewposition();// 获得第一个视类对象在

cgraphicserialview *pview=(cgraphicserialview*)getnextview(p类对象

if (ar.isstoring())

dc.lineto(point);

{

break;

// todo: 在此添加存储代码

case 3:

int ncount=pview->m_obarray.getsize();

dc.rectangle(m_ptorigin.x,m_ptorigin.y,point.x,point.y); break;

for(int i=0;i

case 4:

{

dc.ellipse(crect(m_ptorigin,point));

ar<m_obarray.getat(i);

break;

}

default:

}

break;

else

}

{

// 将图形信息保存起来

// todo: 在此添加加载代码 int ncount;

m_obarray.add(pgraph);// 将一群这样的pgraph组织在一起放进m_obarray

ar>>ncount;

cview::onlbuttonup(nflags, point);

cgraph *pgraph;

}

ar<

cgraph *pgraph=new cgraph( m_ptorigin , point , m_ndrawtype ); // 创建一个pgraph指针指向一个存储图形信息的


vc序列化问题(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中药真伪的性状(经验)鉴别方法

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: