- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MFC序列化保存
MFC序列化保存1说明在使用MFC变成中,有时候我们要保存自定义文件格式。尤其是在编辑画图的时候有时候需要自定义的图片保存格式,一边打开文件后还可以编辑图片。这就需要将图像中的类对象保存下来,以便在再次打开的时候还可以编辑,而如果保存为类似于JPG格式的图片就不能在编辑了。本文主要说明如何用序列化的方法保存自定义格式文件。2背景假设现在我们需要保存一个自定义的类MyRect,表示一个自定义的矩形的类。我们要可以保存类得成员变量,并在再一次打开的时候可以读取MyRect的成员变量。2.1类声明和定义那么首先要注意一点,这个要序列化保存的类必须继承于CObject类。这里我们的MyRect是继承于CWnd类的,我们知道CWnd是继承于CObject,所以我们的MyRect也是CObject的子类。下面我们看一下MyRect类得成员变量有四个int型的数x0,y0,x1,y1分别表示矩形的左上角的xy坐标和右下角的xy坐标。MyRect类得定义如下:#pragmaonce#includeMyRect.hclassMyRect : publicCWnd{//DECLARE_DYNAMIC(MyRect)public:DECLARE_SERIAL(MyRect)MyRect();MyRect(intx0,inty0,intx1,inty1);virtual ~MyRect();void Serialize(CArchive ar);protected:DECLARE_MESSAGE_MAP()private:intx0;inty0;intx1;inty1;public:voiddrawRect(CDC* pDC);};DECLARE_DYNAMIC(MyRect)在生成类的时候系统自动添加的代码,是在动态生成类的时候有用的(具体含义我也不是很清楚,感兴趣的同学可以上网查一查)。由于要使用序列化保存所以我们必须添加第二处标记的那句话DECLARE_SERIAL(MyRect)而这句话已经包含了第一处标记的DECLARE_DYNAMIC(MyRect)的含义,所以同时出现这两个宏定义会出现编译重定义的错误,所以要在添加第二处宏定义的同时标注掉第一处的宏定义。其中需要我们注意的地方我已经用红色背景标注出来,上面我们已经提到了,要序列化保存一个类对象,那么这个类必须是CObject的子类,为什么?应为CObject类提供了一个Serialize(CArchive ar)的函数,所以已经这类以后,我们需要实现这个函数,也就是要告诉程序,在序列化的时候我们需要保存类的那些成员变量,下面是在Myrect.cpp实现:#includestdafx.h#includeMFC_demo.h#includeMyRect.h//IMPLEMENT_DYNAMIC(MyRect, CWnd)IMPLEMENT_SERIAL(MyRect,CObject,1)MyRect::MyRect(){...}void MyRect::Serialize(CArchive ar){if (ar.IsStoring()){arx0y0x1y1;}else{arx0y0x1y1;}}MyRect::MyRect(intx0,inty0,intx1,inty1){...}MyRect::~MyRect(){...}BEGIN_MESSAGE_MAP(MyRect, CWnd)ON_WM_PAINT()END_MESSAGE_MAP()// MyRect message handlersvoidMyRect::drawRect(CDC* pDC){...}标注的第一处和第二处和声明中的是对应的,添加IMPLEMENT_SERIAL(MyRect,CObject,1)同时标注掉IMPLEMENT_DYNAMIC(MyRect, CWnd)。对于Serialize的实现如代码中所示,本例中要保存的就是四个成员变量。2.2一个重要的对象这里我们要介绍一个对象叫做CObArray,这是一个类似于数组的类,他可以实现动态保存CObject的对象。这也是为什么我们要限制要保存的类是CObject的子类。我们在程序中将所有要保存的类的对象都实现存储在CObArray类的对象 m_ObArray中,这个变量我们在Doc类中声明,并实现他的几个操作:Void AddRect(MyRect re)添加对象MyRect* getRect(int index)获得对象Int getRectNum()获取数组中含有类对象的数目实现代码如下:voidCMFC_demoDoc::addRect(MyRect* re){m_ObArray.Add(re);}MyRect* CMFC_demoDoc::getRec
文档评论(0)