热度 22
2012-8-15 00:13
7237 次阅读|
1 个评论
转 http://gongziya.com/1043/mfc%E7%9A%84serialize%E6%9C%BA%E5%88%B6%E5%8F%8A%E5%85%B6%E4%BD%BF%E7%94%A8/ MFC提供了非常方便的串行化函数Serialize()。利用这个机制可以很方便的对文档进行存取和读取。 Serialization就是面向对象世界里面的永久生存机制,对象必须能够永久生存,也就是他们必须能够在程序结束时存储到文件当中,并且能够在程序重新激活时在恢复过来,存储和恢复对象的过程在MFC称之为Serialization,负责这项重要任务的是MFC Object类中的一个名为Serialize()的虚函数,文件的读写操作均通过它来方便的完成。 一个类要支持Serializable,必须遵循以下步骤: 该类必须要继承自CObject 在该类的头文件中添加DECLARE_SERIAL宏 在该类的实现文件中添加 IMPLEMENT SERIAL宏 为该类添加一个缺省构造函数 在该类中重写Serialize( CArchive ar )函数 之后,该类就可以被Serializable。 如何使用 譬如我们新建一个MFC应用程序,为了方便处理数据,我们在程序中单独创建自己的类MyClass: 1 2 3 4 5 6 7 8 9 10 MyClass: public CObject { DECLARE_SERIAL(MyClass) //很重要一定要加上 public : virtual void Serialize(CArchive ar); public : int m_iVal; float m_fVal; }; 在实现文件中: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 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对象了: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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加载机制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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保存机制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 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); 创建MFC程序启动Logo 程序的目标是当打开建立的MFC程序时,首先会显示的是一幅位图logo,而后才显示程序界面。步骤如下:... 利用WinInet开发Internet程序 MS所提供的WinInet开发包是作为ActiveX技术中的一部分,后来MS对WinIne... CInternetSession对象... 在MFC窗口中使用OpenCV显示图像 OpenCV直接提供了函数可直接将图像写入MFC的窗口中,下面是操作的简单代码: ... VC实现对话框之间的数据通信的一种思路 在这里的两个对话框之间的通信现在只考虑从一个对话框中产生另一个对话框的这样的情况。 对于将要在... 在MFC中使用定时器 我们不使用集成开发环境提供的向导来添加定时器,而是手工在程序中添加定时器。 1、 添加WM_T... 怎样在MFC对话框上面的任意位置作画 在MFC中作画,需要将相应的绘图代码写入OnPaint() 函数里,如果在MFC对话框上有一个文本框...