第八章 Document-View 深入探讨(总结)

  1、Document

  Document 在MFC 的CDocument 里头被具体化。CDocument 本身并无任何具体数据,它只是提供一个空壳。当你开发自己的程序,应该从CDocument 衍生出一个属于自己的Document 类别,并且在类别中声明一些成员变量,用以承载(容纳)数据。然后再(至少)改写专门负责文件读写动作的Serialize 函数。应为他派生至CObject,所有它有CObject 所支持的一切性质,包括执行时期型别信息(RTTI)、动态生成(Dynamic Creation)、文件读写(Serialization)。

  2、View

  View 负责描述Document中的资料,也是在在MFC 的CView 里头被具体化。它只是提供一个空壳。当你开发自己的程序,应该从CView 衍生出一个属于自己的View 类别,并且在类别中(至少)改写专门负责显示资料OnDraw 函数(针对屏幕)或OnPrint 函数(针对打印机)。由于CView 衍生自CWnd,所以它可以接收一般Windows 消息(如WM_SIZE、WM_PAINT 等等),又由于它也衍生自CCmdTarget,所以它可以接收来自菜单或工具列的WM_COMMAND 消息。

  3、Frame

  框架窗口在Document/View之上,主要管理UI。 其中对象的生成过程如下:

  4、 Document Template

  MFC 把Document/View/Frame 视为三位一体。其中用 Document Template来管理这个"三人组合"。MFC 有一个CDocTemplate 负责此事。它又有两个

衍生类别,分别是CMultiDocTemplate 和CSingleDocTemplate。而Document Template的控制来自CWinApp。

 BOOL CTestApp::InitInstance()//其中的
{
...
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_SCRIBTYPE,           //资源符号
RUNTIME_CLASS(CScribbleDoc), //Document
RUNTIME_CLASS(CChildFrame), //Frame
RUNTIME_CLASS(CScribbleView)); //View
AddDocTemplate(pDocTemplate); //添加到管理模板
...
}

  5、Serialize:对象的文件读写

  Serializable 的必要条件:欲让一个对象有Serialize 能力,它必须衍生自一个Serializable 类别。一个类别意欲成为Serializable,必须有下列五大条件;

    1. 从CObject 衍生下来。如此一来可保有RTTI、Dynamic Creation 等机能。

    2. 类别的声明部份必须有DECLARE_SERIAL 宏。此宏需要一个参数:类别名称。

    3. 类别的实作部份(cpp文件)必须有IMPLEMENT_SERIAL 宏。此宏需要三个参数:一是类别名称,二是父类别名称,三是schema no.。

    4. 改写Serialize 虚拟函数,使它能够适当地把类别的成员变量写入文件中。

    5. 为此类别加上一个default 构造式(也就是无参数之构造式)。这个条件常为人所忽略,但它是必要的,因为若一个对象来自文件,MFC 必须先动态生成 它,而且在没有任何参数的情况下调用其构造式,然后才从文件中读出对象资料。

  6、DYNAMIC / DYNCREATE / SERIAL 三“宏”

    DECLARE_DYNAMIC / IMPLEMENT_DYNAMIC     //运行时类型识别

    DECLARE_DYNCREATE / IMPLEMENT_DYNCREATE //动态生成

    DECLARE_SERIAL / IMPLEMENT_SERIAL       //文件读写

  7、CObject 类别的最基本虚函数 ---- IsKindOf 和IsSerializable

    IsKindOf()函数,顾名思义,是用来判断一个类是不是派生至某个类。

 BOOL CObject::IsKindOf(const CRuntimeClass* pClass) const

    IsSerializable()函数

  在程序在执行时期判断某类别的schema 号码是否为0xFFFF,藉此得知它是否可以Serialize。其中schema是MFC配置的,如果一个类能Serialize,那么就要将它的schema号码设置为0xFFFF。

 BOOL CObject::IsSerializable() const
{
3   return (GetRuntimeClass()->m_wSchema != 0xffff);//
}

  8、CArchive 类别 ----一块内存缓冲区

  CArchive对运算符进行的重载operator<<  和  operator>>。这对运算符除了实现对基本类型的输入输出,还可以实现继承至CObject的类的输入输出,而如果其他类想使用的话,可以对运算符进行重载。

  如何在一个类中显示串行化

  首先这个类要继承至CObject,然后在头文件里声明如下

  DECLARE_SERIAL(CRectangle);

  virtual void Serialize(CArchive& ar);//重载Serialize函数

  //在CPP文件里实现如下

  IMPLEMENT_SERIAL(CRectangle, CObject, );

 void CRectangle::Serialize(CArchive& ar)
{
if (ar.IsStoring())
ar << m_rect;//
else
ar >> m_rect;//
}

  一章又一章,好多东西看过就忘了,现在记下来,以后复习也方便了。

MFC深入浅出读书笔记第三部分1的更多相关文章

  1. MFC深入浅出读书笔记第一部分

    最近看侯捷的MFC深入浅出,简单总结一下. 第一章首先就是先了解一下windows程序设计的基础知识,包括win32程序开发基础,什么*.lib,*.h,*.cpp的,程序入口点WinMain函数,窗 ...

  2. MFC深入浅出读书笔记第二部分1

    第六章 MFC程序的生死因果 MFC学习过程,这个方法不错,条例清晰. 1.CWinApp  -- 取代WinMain地位 WinMain函数的功能由CWinApp的三个函数实现 virtual BO ...

  3. MFC深入浅出读书笔记第二部分2

    第七章  MFC骨干程序 所谓骨干程序就是指有AppWizard生成的MFC程序.如下图的层次关系是程序中常用的几个类,一定要熟记于心. 1 Document/View应用程序 CDocument存放 ...

  4. 《Linux内核设计与分析》第六周读书笔记——第三章

    <Linux内核设计与实现>第六周读书笔记——第三章 20135301张忻估算学习时间:共2.5小时读书:2.0代码:0作业:0博客:0.5实际学习时间:共3.0小时读书:2.0代码:0作 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. 读书笔记第三周 人月神话 刘鼎乾 PB16070837

    读书笔记第三周:人月神话   这本书主要讲述了如何管理一个软件开发团队的问题,其中如何提高团队的效率可以说是本书的重点之一了.感觉这本书地中文版翻译得比较晦涩,很多表达比较模糊,看起来有些吃力,因此下 ...

  7. WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形

    原文:WPF,Silverlight与XAML读书笔记第三十九 - 可视化效果之3D图形 说明:本系列基本上是<WPF揭秘>的读书笔记.在结构安排与文章内容上参照<WPF揭秘> ...

  8. 《android开发艺术探索》读书笔记(三)--分发机制和滑动冲突

    接上篇<android开发艺术探索>读书笔记(二) No1: 通过MotionEvent对象可以得到点击事件发生的x和y坐标,getX/getY返回的是相对于当前View左上角的x和y坐标 ...

  9. 【高性能Mysql 】读书笔记(三)

    第5章 创建高性能的索引 本文为<高性能Mysql 第三版>第四章读书笔记,Mysql版本为5.5 索引基础 索引的重要性:找一本800面的书的某一段内容,没有目录也没有页码(页码也可类比 ...

随机推荐

  1. JAXB介绍二

    链接上一遍 JAXB介绍一 , 本节主要介绍解析xml的步骤, 下面的例子是在实际项目中运用的, 把它拿出来单独写一个java运行程序. 5. 测试实例 先给出我的代码结构图: 再给出要解析的Scri ...

  2. DB错误代码大全

    db2错误代码大全  sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引 ...

  3. iBrand 教程:Xshell 软件安装过程截图及配置

    下载 教程中使用的相关软件下载网盘: https://pan.baidu.com/s/1bqVD5MJ 密码:4lku 安装 请右键以管理员身份运行进行软件安装,安装过程如下: 配置 安装完成并运行软 ...

  4. STL容器 成员函数 时间复杂度表

    Sequence containers Associative containers   Headers <vector> <deque> <list> <s ...

  5. jquery datatable 获取当前分页的数据

    使用jquery datatable 遇到分页分别求和时,找了半天才找到获取当前分页数据的方法,以此总结 var table=$('#example').DataTable( { "pagi ...

  6. WCF的问题

    使用service调用WCF的时候,有时候会出现 其他信息: HTTP 无法注册 URL 进程不具有此命名空间的访问权限 这样的问题,这时候就需要进行如下尝试: 1,VS的管理权限使用管理员的权限. ...

  7. mkfs.xfs 命令找不到的解决方法

    对硬盘进行格式化: # mkfs.xfs /dev/sdb1 系统显示: mkfs.xfs error: command not found. 可能是系统不完全安装 运行 which mkfs  查看 ...

  8. 【BZOJ4571】[SCOI2016] 美味(主席树)

    点此看题面 大致题意: 给你一个序列\(a\),然后每次询问\(max_{i=l}^r(a_i+x)\ xor\ b\). 大致思路 首先,我们要知道一个简单的性质:位运算时位与位之间是互不影响的. ...

  9. 20.JSON

    JSON是javascript的一个子集,利用js中的一些儿模式来表示结构化数据.不是只有javascript才使用JSON,JSON是一种数据格式,很多编程语言都有针对JSON的解析器和序列化器. ...

  10. ML.NET技术研究系列1-入门篇

    近期团队在研究机器学习,希望通过机器学习实现补丁发布评估,系统异常检测.业务场景归纳一下: 收集整理数据(发布相关的异常日志.告警数据),标识出补丁发布情况(成功.失败) 选择一个机器学习的Model ...