1. OnNewDocument()调用过程:

程序启动->CWinApp:;OnFileNew(m_pDocManager->OnFileNew()) ->CDocManager::OnFileNew(pTemplate->OpenDocumentFile(NULL)) ->CSingleDocTemplate::OpenDocumentFile(CreateNewDocument->CreateNewFrame     pDocument->OnNewDocument) -> CGraphicDoc::OnNewDocument

2.Serialize()调用过程

文件打开菜单命令->CWinApp::OnFileOpen(m_pDocManager->OnFileOpen()) ->CDocManager::OnFileOpen(调用DoPromptFileName函数显示文件打开对话框->AfxGetApp()->OpenDocumentFile) ->CWinApp::OpenDocumentFile(m_pDocManager->OpenDocumentFile) ->CDocManager::OpenDocumentFile ->CSingleDocTemplate::OpenDocumentFile(pDocument->OnOpenDocument) ->CDocument::OpenDocument(构造一个CFile::modeRead模式的Cfile对象-》构造一个CArchive::load模式的CArchive对象-》Serialize(loadArchive))->CGraphicDoc::Serialize

[文件\新建]和【文件\打开】菜单项的命令响应函数都是在CWinApp类中提供的。CWinApp类有一个成员变量:m_pDocManager,是指向CDocManager对象的指针,也就是说,CWinApp负责管理文档管理器,而后者有一个文档模板指针链表:m_templateList,用来保存文档模板的指针,即文档管器负责管理文档模板,而后者又是用来管理文档类、框架类和视类的,始终让这三个对象三位一体,一起为文档服务。

MFC提供了非常方便的串行化函数Serialize()。利用这个机制可以很方便的对文档进行存取和读取。

Serialization就是面向对象世界里面的永久生存机制,对象必须能够永久生存,也就是他们必须能够在程序结束时存储到文件当中,并且能够在程序重新激活时在恢复过来,存储和恢复对象的过程在MFC称之为Serialization,负责这项重要任务的是MFC Object类中的一个名为Serialize()的虚函数,文件的读写操作均通过它来方便的完成。

一个类要支持Serializable,必须遵循以下步骤:

该类必须要继承自CObject

在该类的头文件中添加DECLARE_SERIAL宏

在该类的实现文件中添加 IMPLEMENT SERIAL宏

为该类添加一个缺省构造函数

在该类中重写Serialize( CArchive& ar )函数

之后,该类就可以被Serializable。

如何使用:

譬如我们新建一个MFC应用程序,为了方便处理数据,我们在程序中单独创建自己的类MyClass:

MyClass:public CObject

{

DECLARE_SERIAL(MyClass)     //很重要一定要加上

public:

virtual void Serialize(CArchive& ar);

public:

int m_iVal;

float m_fVal;

};

在实现文件中:

IMPLEMENT_SERIAL(MyClass,CObject,1)

void MyClass::Serialize(CArchive& ar)

{

if(ar.IsLoading())

{

//从文件中读取数据到内存中

ar >> m_iVal;

ar >> m_fVal;

}

else if(ar.IsStoring())

{

ar << m_iVal;

ar << m_fVal;

}

}

然后在MFC程序的C**Doc类中添加一个MyClass类型的对象myclass:

class C***Doc : public CDocument

{

public:

C***Doc();

DECLARE_DYNCREATE(C***Doc)

public:

MyClass myclass;

public:

virtual void Serialize(CArchive& ar);

*******

}

并且在C***Doc类的Serialize()函数中调用我们的myclass对象的Serialize函数就可以永久保存myclass对象了:

IMPLEMENT_DYNCREATE(C***Doc, CDocument)

BEGIN_MESSAGE_MAP(C***Doc, CDocument)

END_MESSAGE_MAP()

IMPLEMENT_SERIAL(MyClass,CObject,1);

void C***Doc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

myclass.Serialize(ar);

}

else

{

myclass.Serialize(ar);

}

}

如何触发Serialize

当我们新建一个基于文档的MFC程序时,向导会自动为我们创建一些菜单,点击菜单的保存或者打开文件按钮时,内部机制自动触发Serialize函数调用,那么怎样在程序中自己触发Serialize呢?

剖开文件保存和打开内部机制(详见深入浅出MFC),对于读取文件,会得到类似这样的调用来触发Serialize加载机制:

CFileException fe;

CFile *pFile=GetFile("d://file.txt",

CFile::modeRead | CFile::shareDenyWrite,

&fe);

DeleteContents();

SetModifiedFlag();

CArchive loadArchive(pFile,CArchive::load );

loadArchive.m_pDocument=this;

loadArchive.m_bForceFlat=FALSE;

CWaitCursor wait;

if(pFile->GetLength()!=0)

Serialize(loadArchive);

loadArchive.Close();

ReleaseFile(pFile,FALSE);

类似的,可以使用下面的操作来触发Serialize保存机制:

CFileException fe;

CFile *pFile=GetFile("d://file.txt",CFile::modeCreate|

CFile::modeWrite | CFile::shareDenyWrite,

&fe);

DeleteContents();

SetModifiedFlag();

CArchive saveArchive(pFile,CArchive::store );

saveArchive.m_pDocument=this;

saveArchive.m_bForceFlat=FALSE;

CWaitCursor wait;

if(pFile->GetLength()!=0)

Serialize(saveArchive);

saveArchive.Close();

ReleaseFile(pFile,FALSE);

转:http://blog.sina.com.cn/s/blog_914851f70102v2i2.html

MFC的Serialize机制及其使用(转)相关推荐

  1. MFC六大核心机制之四:永久保存(串行化)

    永久保存(串行化)是MFC的重要内容,可以用一句简明直白的话来形容其重要性:弄懂它以后,你就越来越像个程序员了! 如果我们的程序不需要永久保存,那几乎可以肯定是一个小玩儿.那怕我们的记事本.画图等小程 ...

  2. 如何优雅的写UI——(1)MFC六大核心机制-程序初始化

    很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...

  3. MFC六大核心机制之三:动态创建

    MFC中很多地方都使用了动态创建技术.动态创建就是在程序运行时创建指定类的对象.例如MFC的单文档程序中,文档模板类的对象就动态创建了框架窗口对象.文档对象和视图对象.动态创建技术对于希望了解MFC底 ...

  4. MFC六大核心机制之二:运行时类型识别(RTTI)

    上一节讲的是MFC六大核心机制之一:MFC程序的初始化,本节继续讲解MFC六大核心机制之二:运行时类型识别(RTTI). typeid运算子 运行时类型识别(RTTI)即是程序执行过程中知道某个对象属 ...

  5. MFC六大核心机制之一:MFC程序的初始化

    很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...

  6. 【MFC系列-第9天】MFC消息映射机制的原理

    关注公号[逆向通信猿]更精彩!!! 第9天 MFC消息映射机制的原理 9.1 对话框常用的回调函数 a)窗口创建时的消息和虚函数包括:WM_CREATE,WM_INITDIALOG,和PreSubcl ...

  7. MFC消息响应机制及映射机制理解

    一.MFC消息响应机制分析 ---- MFC是Windows下程序设计的最流行的一个类库,但是该类库比较庞杂,尤其是它的消息映射机制,更是涉及到很多低层的东西,我们在这里,对它的整个消息映射机制进行了 ...

  8. 用MFC消息映射机制自定义消息

    Windows系统中的程序大部分都是通过消息和事件驱动的.在windows下的应用程序主要工作是进行消息的循环处理,通过循环等待消息的到来和事件的发生,然后对不同的消息和事件运行相关的代码,完成相应的 ...

  9. MFC六大核心机制之一MFC程序的初始化

    原文地址: http://www.jizhuomi.com/software/267.html 很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识 ...

最新文章

  1. Kafka 顺序消费方案
  2. 《每周CV论文》人脸识别难题:遮挡年龄姿态妆造亲属伪造攻击
  3. OpenStack 部署运维实战
  4. Python小游戏之 - 飞机大战 !
  5. python中的zip()函数和map()函数
  6. C指针原理(25)-gtk
  7. java远程下载文件到本地_java远程下载文件到本地
  8. 贷款总是被拒,到底是什么原因?
  9. Boolan STL 第三周笔记
  10. Mysql查询为空赋值为0
  11. 图的深度优先遍历和宽度优先遍历C语言,图的遍历BFS广度优先搜索
  12. 10大黑客专用的 Linux 操作系统...
  13. Linux命令之iconv命令
  14. python open函数关于w+ r+ 读写操作的理解
  15. 怎么修改数据库服务器名字,如何更改数据库服务器名字
  16. python生成的exe反编译
  17. 求助matlab崩溃问题的解决方案
  18. 可行性研究及需求分析
  19. [Web端接入经验分享] 腾讯云即时通信TIM、实时音视频TRTC
  20. 专访Polychain创始人Olaf:我们只囤币,从不做空

热门文章

  1. floyed java_Floyd算法java实现demo
  2. JAVA复习5(集合——LinkedList)
  3. log4j记录不同的日志_使用log4j将不同类型的日志信息记录到不同的文件中
  4. postfix 部署ssl后还是25_宝塔面板的邮局管理器Postfix无法启动解决办法
  5. python出题器_随手写的python出题小玩意
  6. FPGA实现A5算法并仿真
  7. 多态_月隐学python第18课
  8. 计算机优点 缺点劣势英语作文,Internet网的优点与缺点英语作文
  9. mdp框架_强化学习:MDP(Markov Decision Process)
  10. docker 删除_docker 批量删除镜像