VC++深入详解·chapter13·笔记

1、CArchive类:
   1> CArchive类没有基类。我们可以利用此类将对象数据保存到永久设备(如磁盘文件)上。
   2> 让对象数据持久性的过程称之为串行化(或序列化)
   3> 读者可以认为一个CAchive对象就是一种二进制六。一个CAchive对象以一种有效的、非冗余的格式处理二进制对象数据。
   4> 创建CArchive对象前先创建一CFile类或其派生类对象与之关联,且CFile对象的打开方式与文档对象的加载/保存状态相一致。
   5> CArchive对象不仅可以处理基本类型的数据,还可以处理CObject类的派生类的数据。(提取(>>)和插入(<<))
   eg:
   写入文件:
   void CArchiveView::OnFileWrite()
   {
       // TODO: 在此添加命令处理程序代码
       CFile file(_T("1.txt"), CFile::modeCreate | CFile::modeWrite);
       CArchive ar(&file, CArchive::store);
       int i=4;
       char ch='a';
       float f=1.3f;
       CString str("hi.baidu.com/斯芬克斯86");
       ar<<i<<f<<ch<<str;
   }
   读取文件:
   void CArchiveView::OnFileRead()
   {
       // TODO: 在此添加命令处理程序代码
       CFile file(_T("1.txt"), CFile::modeRead);
       CArchive ar(&file, CArchive::load);
       int i=0;
       char ch;
       float f;
       CString str;
       ar>>i>>f>>ch>>str; //对象保存的顺序和提取的顺序必须一致
       CString strResult;
       strResult.Format(_T("%d,%c,%f,%s"), i, ch, f, str);
       MessageBox(strResult);
   }

2、文档类的OnNewDocument函数:
   1> 是文件/新建命令处理的一部分,是由框架调用的一个虚函数。(不是一个消息响应函数。)
   2> 此函数的调用过程  
   3> 可以在函数中设置文档的标题:this->SetTitle(_T("NewTitle"));   
   4> 当程序初始启动时,或者单击“新建”菜单项时都会调用此函数
   5> CDocMamager类内部有一个CPtrList类型的指针链表(m_templateList),维护了一些列的文档模版指针。App类的 InitInstance中
       的AddDocTemplate函数加入一个文档模版指针时,实际上就是加入倒CDocManager对象的这个指针连表中
   6> 含afx_msg的函数表示是命令消息响应函数
   7> MFC提供的文档/视类结构的一个特点:每当有一份文档产生时,总是会产生一个文档类对象、框架类对象和视类对象,它们三位一体来为这份文档服务

3、IDR_MAINFRAME字符串资源:
   1> 是由“/n”字符分隔的7个子串
   2> IDR_MAINFRAME字符串资源是何时传递给程序的框架的呢?在App类的InitInstance函数中,程序调用AddDocTemplate 函数将已构造的文档模版对象加入到应用程序的文档模版链中,这时就把IDR_MAINFRAME字符串资源传递给应用程序的框架了。
   3> IDR_MAINFRAME资源同时表示:字符串资源、菜单资源和图标资源。(一个资源ID可以标识多种资源)  
   4> GetDocString函数:文档模版类CdocTemplate的成员函数,可用来获取IDR_MAINFRAME字符串资源的各个字串。
   5> 可以直接手动设置这7个字串来改变对话框属性。第4、5个要一起使用,eg:将第四个设为"Text Files(*.txt)",第五个设为".txt"。

4、文档类的Serialize函数:
   1> 文档类提供的用来保存和加载数据的函数,我们可以利用其参数提供的CArchive对象来保存或加载我们自己的数据。
   2> 此函数的调用过程
   3> “文件/新建”和“文件/打开”菜单项的命令响应函数都是CWinApp类中提供得的。CWinApp类有一个成员变量:m_pDocManager,是指向CDocManager对象的指针,也就是说,CWinApp负责管理文档管理器,而后者有一个文档模版指针链表:m_templateList,用来保存文档模版的指针,即文档管理器负责管理文档模版,而后者又是用来管理文档类、框架类和视类的,始终让这三个对象三位一体,一起为文档服务。
   eg:
   void CArchiveDoc::Serialize(CArchive& ar)
   {
       if (ar.IsStoring())   //点击“文件/保存”
       {
           // TODO: 在此添加存储代码
           int i=5;
           char ch='b';
           float f=1.2f;
           CString str(_T("http://hi.baidu.com/斯芬克斯86"));
           ar<<i<<ch<<f<<str;
       }
       else //点击“文件/打开”
       {
           // TODO: 在此添加加载代码
           int i;
           char ch;
           float f;
           CString str;
           CString strResult;
           ar>>i>>ch>>f>>str;
           strResult.Format(_T("%d,%c,%f,%s"), i, ch, f, str);
           AfxMessageBox(strResult);
       }
   }

5、可串行化的类:
   1> 如果要用CArchive类保存一个对象的话,那么这个对象的类必须支持串行化
   2> 如果要使一个类可串行化,可以经过以下五步来实现:
       1)从CObject派生类(或从CObject派生的某个类派生)
       2)重写Serialize成员函数
       3)使用DECLARE_SERIAL宏(在类声明中)。该宏的声明形式如下所示:DECLARE_SERIAL( class_name )
       4)定义不带参数的构造函数
       5)为类在实现文件中使用IMPLEMENT_SERIAL宏。该宏的声明形式如下所示:IMPLEMENT_SERIAL( class_name, base_class_name, wSchema)
          wSchema是版本号。
   注:当从文件中读取对象数据时,需要对所保存的数据版本号进行判断,如果与当前CArchive对象的版本号一致,则加载操作成功,否则失败
        第四步:在利用CArchive类重载的提取操作符>>读取对象时,它会自动调用元素类的不带参数的构造函数去构造相应对象,然后将这个对象的地址赋给一个指针。
   3> 在利用文档类的Serialize函数保存一个可串行化类的对象的数据时,实际上利用的是对象本身的Serialize函数来完成的。因此,要求在设计可串行化的类时,在其内部确定需要串行化的数据。这就是可串行化的内部实现机制。

6、拷贝资源:可以直接从另一个工程中拷贝已有的资源。一个工程的所有资源都存放在ProjectName.rc文件中,只需要找到此文件,并在另一工程中“文件/打开”即可。拷贝后要更改ID

7、在文档类中获得视类的对象:
   POSITION pos=GetFirstViewPosition(); //获得与文档类相关的视类链表中第一个视类对象的位置
   CArchiveView* pView=(CArchiveView* )GetNextView(pos); //得到当前位置所指示视类对象的指针,并用pos参数返回下一个视类对像的位置。此函数可迭代使用,如果到了视类链表的末尾,即没有下一个视类对象了, pos的值就会被设置为NULL
   注:POSITION被MFC中的集合类用来标识集合中元素的位置

8、在视类中获得文档类的成员:
   直接利用视类本身提供的GetDocument函数即可。
   在绘制窗口时,应用程序框架将调用OnDraw函数,并认为数据应当是从文档类对像中获得倒的,于是就自动添加了获取文档对象指针的调用。

9、Document/View结构:P517

10、利用CObArray类对串行化的支持保存和加载数据:
   1> CObArray类结合了IMPLEMENT_SERIA宏支持串行化。即,CObArray类本身也支持串行化,也有一个Serialize函数。
   2> 直接在文档类Serialize的if/else语句后加上m_obArray.Serialize(ar);即可

11、文档对象数据的销毁:
   1> 文件/新建:CDocument类的OnNewDocument函数--->DeleteContents函数
       文件/打开:框架类的OnOpenDocument函数--->DeleteContents函数
   2> 当新建文件、打开文件或者关闭程序时,也即是说,当文档类对象被销毁时,都回去调用文档类对象的DeleteContennts函数(override)
   3> DeleteDocuments函数是一个虚函数,主要是由框架调用,用来删除文档的数据,同时并不销毁CDocument对象本身。它是在文档将要被销毁之前被调用,它也会在该文档对象在重复使用之前被调用,以确保文档是空的。用户可以重写此函数,然后在其中销毁堆中分配的内存。
   4> CObArray类的RemoveAt会导致元素的重排。在依次删除时建议:(1)依次处理完元素,然后一次RemoveAll;(2)从后往前删,即从下标大的元素开始删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值