第13课 文档与串行化

1.CArchive 保存时的代码
(1)保存
 CFile file("1.txt",CFile::modeCreate | CFile::modeWrite);
 CArchive ar(&file,CArchive::store);
 int i=4;
 char ch='a';
 float f=1.3f;//c/c++中,浮点数在默认情况下被定义为double类型,如果希望指定为float类型,需要在该数值后面加上字母f
 CString str("http://www.sunxin.org");
 ar<<i<<ch<<f<<str;  //保存
(2)打开
 CFile file("1.txt",CFile::modeCreate | CFile::modeRead);
 CArchive ar(&file,CArchive::store);
 int i;
 char ch;
 float f;//c/c++中,浮点数在默认情况下被定义为double类型,如果希望指定为float类型,需要在该数值后面加上字母f
 CString str;
 ar>>i >> ch >> f >> str;  //打开,注意:对象提取的顺序跟保存的顺序必须保持一致

2. 文档 -  视类结构简介
  在CDocument类中通过SetTitle函数来修改文档的标题。
   OnNewDocument  在程序启动时被调用,此时可设置文档标题,也可以在 String TableIDR_MAINFRAME 的第二个 "\n"后改变文档的标题。须了解的 7个字符串的用途,见PPT
  另外,一个资源ID可以表示多种资源,例如IDR_MAINFRAME可以表示字符串资源,菜单,图标等资源,如下。

    WinAPP InitInstance()中完成DOC,View,MainFrame的归一。
    当点击系统的打开和新建菜单时,有一系列的步骤,孙鑫老师给我们跟踪了代码的调用过程,此段跟踪我们略过。但我们要牢记住: CWinAPP负责管理文档管理器,文档管理器有一个指针链表,且来保存文档模板的指针,文档模板指针管理三个类 DOCVIEW MAINFRAME,使其为某文件对象服务。

3. 利用 CArchive  来保存一个类的对象,此类必须支持串行化,需要 5个步骤。
  a. 让类从 CObject  派生;
  b. 覆盖 Serialize()  函数,在其中完成保存和读取功能;
  c. .h  中加入 DECLARE_SERIAL(CGraph)
  d. 在。 cpp  中加入IMPLEMENT_SERIAL(CGraph, CObject, 1 )//第三个参数是一个版本号
  e. 定义一个不带参数的构造函数。

  保存绘画数据到文件的简单过程(串行化)
  a. CGraph  中增加一个画图的成员函数,其实不增加也行。可以在 View中完成相应功能。
  b. 增加四个画图菜单,菜单可以从  11课的代码中拷贝。
  c. View  中增加LButtonDown UP的响应,在UP中画图,在 DOWN中保存点
  d. 利用 CObArray  集合类来保存绘画数据
  e. CGraphicDOC::Serialize()  中保存和读取数据
  f. 然后在 OnDraw  中重绘。

4. 新建和打开文档时,要注意销毁原来的数据。在  DOCDeleteContents 虚函数中是好时机。代码如下
 int nCount;
(1)方法1
 nCount=m_obArray.GetSize();
 /*for(int i=0;i<nCount;i++)
 {
  delete m_obArray.GetAt(i);//  释放指针指向的内存空间
 }
 m_obArray.RemoveAll();*/
(2)方法2
 while(nCount--)
 {
  delete m_obArray.GetAt(nCount);
  m_obArray.RemoveAt(nCount);
 }

猜你喜欢

转载自blog.csdn.net/zhang_zxk/article/details/52401929
今日推荐