第8章文档和视图研究.ppt

  1. 1、本文档共24页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
例2:在利用MFC生成的单文档程序中实现文档的读取。 (1)用MFC AppWizard创建一个默认的单文档应用程序Ex_SDIArchive。 (2)打开String Table资源,文档模板字串资源IDR_MAINFRAME内容修改: 文档序列化操作\n\n\n自定义文件(*.my)\n.my \nExSDIArchive.Document\nEx_SDI Document (3)为CEx_SDIArchiveDoc类添加下列成员变量: public: CString m_strData; (4)在CEx_SDIArchiveDoc类OnNewDocument函数中添加下列代码: BOOL CEx_SDIArchiveDoc::OnNewDocument() { … m_strData=这a是一行文本!; return TRUE; } (5)在CEx_SDIArchiveDoc::Serialize函数中添加下列代码: void CEx_SDIArchiveDoc::Serialize(CArchive ar) { if (ar.IsStoring()) ar.WriteString(m_strData); else ar.ReadString(m_strData); } (6)为CEx_SDIArchiveView类添加下列成员变量: public: CString m_str; (7)在CEx_SDIArchiveView类OnDraw函数中添加下列代码: void CEx_SDIArchiveView ::OnDraw(CDC* pDC) { … m_str=pDoc-m_strData; pDC-TextOut(100,50,m_str); } * 说明: MFC应用程序用文挡与视图一起来完成数据的 存取和显示,将数据的具体显示与管理维护分离开来,这种编程模式称为 “文档视图结构”。 文档与视图的关系是“一对多”的关系,即每个文档可以有多个视图,但每个视图只能对应于一个确定的关联文档。 用户通过与视图的交互查看数据并对数据进行修改,然后将处理过的数据经过相应的文档成员函数传回文档对象,文档对象获得处理过的数据之后,完成相应的必要修改,最后保存到永久存储区中。 这需要一些准备,创建一个能串行化的其成员变量的类的基本步骤如下:   1) 由CObject派生此类。   2) 在类定义部分放置DECLAR_SERIAL( )宏。   3) 在类实现部分放置IMPLEMENT_SERIAL( )宏。   4) 重载类中的Serialize( )函数。   5) 提供一个类的空的缺省构造函数。 IMPLEMENT_SERIAL宏与DECLARE_SLRIAL( )组成一对,它提供了使类具有持续能力的函数的实现。此宏的三个变元是类名、直接基类名和方案号。方案号类似一个版本号。在多数情况下,可使用0或1作为方案号。 2. 运行时类型信息   要将对象保存到文件,只要保存对象的各个数据成员就可以了;而 从文件读入对象时,程序根据什么信息判断要读入的对象类型,从而动态地重构对象 呢?这就是运行时类型信息 (Run-time class information即RTTI)所要作的工作。   每当创建一个新类,都记录必要的类型信息,产生一个运行时类型信息表 (链表),以便运行时进行类型检查。类型信息由CRuntimeClass结构记录,其[ 定义 ]如下:   这三组宏的级别是递增的,即后面的宏包含前面宏的功能 ,包含更多的信息 。这些复杂的宏通过宏替换在类中插入有关实现动态创建或序列化的代码,包括类名,指向类的缺省构造函数的函数指针 及运行时类型信息 等信息。当读入数据时,可根据读入的类型信息调用该类的构造函数创建对象,使文档中保存的各类都得到正确的重构。在此对宏不作仔细分析,读者可查阅相关参考资料。   从上面的例子我们可以看到,文档、视图和框架类都是声明为第二组宏,即可动态创建类。而下面创建的 CStudent类因为要实现序列化,声明为第三组宏。   现在应该知道为什么可序列化的类都应派生自 CObject类,因为它包含了记录运行时类型信息的结构体。 从文件读入对象时,程序根据运行时类型信息表中的记录判断要读入的对象类型,调用其缺省构造函数,动态地重构对象。 * 文档应用程序框架结构是在程序运行一开始构造的。 多文档模板类CMultiDocTemplate的构造函数也有相同的定义。代码: 利用

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档