百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

初步带你——了解一下MFC mfc mfm

yuyutoo 2024-10-17 17:01 6 浏览 0 评论

图形文件的保存和读取

序列化

绘图程序中的数据需要以文件的形式加以保存。在MFC应用程序中一般采用序列化的方法进行文档的读写。

在绘图程序中有许多自定义类,如CLineType、CFill、CLine、CCurve、CRectangle等。为了使一个自定义类的对象具有持久性,必须让自定义类支持序列化。如果要保存的数据是文档派生类的数据成员,那么实现文档的序列化非常简单,只需要对序列化函数Serialize()进行完善。

自定义类的序列化

但如果要让一个自定义类支持序列化,那么数据的存储和读取都要由自定义类自己去完成。

自定义类序列化的前提条件

自定义类可序列化的前提条件是必须直接或间接地从CObject派生,类都带有一个不带参数的构造函数,绘图程序中有关图形的自定义类都满足这两个条件。此外需要完成以下操作:

要使用MFC序列化宏。在类的头文件中包含宏 DECLARE_SERIALIZE;在类的实现文件中包含宏IMPLEMENT_SERIAL;

自定义类必须重载序列化成员函数Serialize(),使其支持对自定义类的特定数据的序列化。

并且,任何需要序列化的对象都应该在文档派生类中作为数据成员进行声明。

自定义类的序列化

修改MyDrawSystem案例程序,使之具有序列化功能。

【编程步骤】

(1) MyDrawSystem程序中涉及到序列化的自定义类有:线型类CLineType、填充类CFill、直线类CLine、自由曲线类CCurve、矩形类CRectangle。

按照序列化的条件,在上述五个类的声明头文件中添加函数Serialize()的声明和DECLARE_SERIAL 宏。

其使用形式为:

DECLARE_SERIAL( class_name )

DECLARE_SERIAL宏包括了DECLARE_DYNAMIC宏 和 DECLARE_DYNCREATE宏所具有的功能。

在上述五个类的实现文件中添加函数Serialize()的实现代码和IMPLEMENT_SERIAL 宏。IMPLEMENT_SERIAL 宏的使用形式如下:可以加下群466572167(群内有C/C++的学习资料以及各类型的项目学习资料)

IMPLEMENT_SERIAL( class_name,

base_class_name, wSchema )

其中参数wSchema为类对象版本号,使用大于或等于零的整数。如果要使Serialize成员函数能够读取多个版本(即,读取应用程序的不同版本写入的文件),可将VERSIONABLE_SCHEMA值作为IMPLEMENT_SERIAL宏的参数。

以CLine类为例,其头文件代码修改如下。

#include "LineType.h"

class CLine : public CLineType

{

DECLARE_SERIAL(CLine)

public:

……

virtual void Serialize(CArchive &ar);

//重载序列化函数

};

注意:其余四个类的头文件同样处理

CLineType类的.cpp文件添加代码如下。

……//包含命令

IMPLEMENT_SERIAL(CLineType, CObject, 0)

void CLineType::Serialize(CArchive &ar)

{

if(ar.IsStoring())

ar << m_nType << m_nLineWidth << m_nLineType

<< m_LineColor;

else

ar >> m_nType >> m_nLineWidth >> m_nLineType

>> m_LineColor;

}

CFill类的.cpp文件添加代码如下。

IMPLEMENT_SERIAL(CFill,CLineType,0)

void CFill::Serialize(CArchive &ar)

{

CLineType::Serialize(ar);

if(ar.IsStoring())

ar << m_nFillPattern << m_FillColor;

else

ar >> m_nFillPattern >> m_FillColor;

}

CLine类的.cpp文件添加代码如下。

IMPLEMENT_SERIAL(CLine,CLineType, 0)

void CLine::Serialize(CArchive &ar)

{

CLineType::Serialize(ar);

if(ar.IsStoring())

ar << m_Begin << m_End ;

else

ar >> m_Begin >> m_End ;

}

CCurve 类的.cpp文件添加代码如下。

IMPLEMENT_SERIAL(CCurve,CLineType, 0)

void CCurve::Serialize(CArchive &ar)

{

CLineType::Serialize(ar);

m_CurveArray.Serialize(ar);

}

注意:由于构成自由曲线的所有的点对象被保存到CArray类的对象中。CArray类属于集合类,所有的集合类都是从CObject类派生出来的,并且集合类声明中都包含有DECLARE_SERIAL宏调用,因此可以通过调用集合类的Serialize成员函数,方便地完成集合的序列化。可以加下群466572167(群内有C/C++的学习资料以及各类型的项目学习资料)

CRectangle类的.cpp文件添加代码如下。

IMPLEMENT_SERIAL(CRectangle,CFill, 0)

void CRectangle::Serialize(CArchive &ar)

{

CFill::Serialize(ar);

if(ar.IsStoring())

ar << m_TopLeft << m_BottomRight ;

else

ar >> m_TopLeft >> m_BottomRight ;

}

(2)在绘图过程中生成的每个图形对象都被加入到CObList类的对象m_FigureList(图元对象链表)中。

CObList类属于集合类,所有的集合类都是从CObject类派生出来的,并且集合类声明中都包含有DECLARE_SERIAL宏调用,因此可以通过调用集合类的Serialize成员函数,方便地完成集合的序列化。可以加下群466572167(群内有C/C++的学习资料以及各类型的项目学习资料)

在文档派生类文件MyDrawSystemDoc.cpp中添加代码如下。

void CMyDrawSystemDoc::Serialize(CArchive& ar)

{

m_FigureList.Serialize(ar); //图元对象链表序列化

if (ar.IsStoring())

{

// TODO: add storing code here

}

else

{

// TODO: add loading code here

}

}

编译、连接并运行程序,可以看到程序已经具有了序列化功能。

相关推荐

MATLAB实例讲解—求二元函数的极值

实例程序...

解析式大赛的获奖作品代码和公式公布啦!

上方超级数学建模可加关注传播数学干货,学会理性的方式去思考问题大家期待已久的运行代码终于新鲜出炉了!!!抱歉让各位粉丝久等了接下来就是揭秘奇迹的时刻1、emoji解析式:无代码:holdon...

基于MATLAB的ACC控制算法设计及仿真测试

作者...

MATLAB基础学习之坐标转换(matlab改坐标)

(一)平面坐标转换1.cart2pol:将笛卡尔坐标转换为极坐标;2.pol2cart:将极坐标转换为笛卡尔坐标;(二)立体坐标转换1.cart2sph:将笛卡尔坐标转换为极坐标;2.sph2cart...

Java NIO:从 Buffer、Channel、Selector 到 Zero-copy、I/O 多路复用

NIO...

「太极创客」零基础入门学用物联网 - MQTT篇 1-9 自我测试

到目前为止,我们已经掌握了MQTT通讯的基本流程以及如何使用ESP8266来发布和订阅MQTT消息。这节课我们来进行自我测试。...

用豆包改了一下午程序,感觉它聪明得超乎想象

之前低估了AI的聪明程度,AI持续学习下去,未来可以做的事情太多了,编程已经算是比较复杂的事情都能完成得这么好,那些项目计划、工作报告更是小儿科。今天用豆包改了几个程序,提出的BUG也能修改完成...

Node-Media-Server开源流行Nodejs流媒体服务器

简介Node-Media-Server一个Node.js实现的RTMP/HTTP/WebSocket/HLS/DASH流媒体服务器。开源github地址:https://github.com/il...

如何应对 RAG 开发挑战?12 个痛点逐一击破

受到论文《SevenFailurePointsWhenEngineeringaRetrievalAugmentedGenerationSystem》的启发,并结合实际开发RAG(检...

团队协作-代码格式化工具clang-format

环境:clang-format:10.0.0前言统一的代码规范对于整个团队来说十分重要,通过git/svn在提交前进行统一的ClangFormat格式化,可以有效避免由于人工操作带来的代码格式问题。C...

如何编写自己的Arduino库?(arduino怎么自己写库)

支持一对一答疑的购买地址...

Auto CAD 命令(A)(cad命令aaw)

ABOUT(命令)显示有关产品的信息。...

一文读懂设计模式,看这篇就够了(设计模式是干嘛的)

转载:javadoop.com/post/design-pattern一直想写一篇介绍设计模式的文章,让读者可以很快看完,而且一看就懂,看懂就会用,同时不会将各个模式搞混。自认为本文还是写得不错的,花...

ASL开发者指南:构建健壮高效的C++应用

1.库介绍AdobeSourceLibraries(ASL),现在由stlab维护,是一组专注于提供高质量、经过实战检验的C++组件的集合。它最初由Adobe公司开发,旨在解决构建...

linux下GDB使用方法(linux怎么用gdb调试)

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。一般来说,GDB主要帮助你完成下面四个方面的功能:1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。2、可让被调试的程...

取消回复欢迎 发表评论: