第2节 基于文档模板架构的序列化存储
“模板”提供一种固定的样式,其大部分内容都是内部开发好了的,开发者只要作少量修改即可快速生成功能强大的软件。文档模板类(CDocTemplate)将视图类(CView)、文档类(CDocument)和框架类(CFrameWnd)捆绑在一起。文档模板将类型信息在注册表中进行注册,使得在双击文档类型的文件时,操作系统根据注册信息找到执行文件启动进程并加载该文档。
创建一个工程名为“md”的MDI程序,开发基于文档模板架构的绘图软件。
1)在向导第1步,选择多文档和文档视图框架,如图13-8所示。

图13-8 创建文档视图架构的程序
2)在向导第4步,单击“Advanced”按钮填写文档信息,如图13-9所示。

图13-9 文档模板设置
3)在向导第5步,单击“As a statically linked library”,选择静态链接MFC类库模式,如图13-10所示。

图13-10 MFC应用程序向导
4)在MFC应用程序向导最后一步,选择CScrollView作为视图类,如图13-11所示。

图13-11 选择视图基类(共有8个类可选)
5)在ResourceView中修改工具栏资源,添加一些工具按钮,如图13-12所示。

图13-12 编辑工具栏资源
6)部分工具栏按钮ID见表13-2。
表13-2 部分工具栏按钮ID

7)在类视图中添加一个普通类CLayer(无基类),如图13-13所示。

图13-13 通过右键菜单添加新类
8)修改CLayer类的头文件,使其成为一个抽象类。


9)在类视图中添加一个CLayer类的派生类用于处理矩形图层,如图13-14所示。

图13-14 添加派生类
10)修改CRectan类的头文件,重写所有基类中的虚函数并添加成员变量。


11)修改CRectan类的源文件,编写所有类成员函数的代码。


12)修改CLayer类的源文件。

(https://www.daowen.com)
13)修改CMdView类的头文件,添加一些成员变量。

14)修改CMdView类的初始化函数OnInitialUpdate。

15)在CMdView类添加所有工具的消息映射函数(包括COMMAND和UPDATE_COMMAND_ UI),如图13-15所示。

图13-15 添加工具栏按钮的消息映射函数
16)修改添加的消息映射函数的代码。


17)修改CMdDoc类的头文件,添加管理图层信息的成员变量。

18)在CMdView类中添加一些鼠标消息映射函数,如图13-16所示。

图13-16 添加消息映射函数
19)修改建立的所有消息映射函数的代码。



20)修改OnDraw函数的代码。

21)在CMdDoc类中修改序列化函数的代码。


22)在CMdDoc类中,添加虚函数DeleteContents并修改代码。

23)编译并运行,测试代码,如图13-17所示。

图13-17 查看运行结果
每次绘制新的矩形或者拖动一个矩形,关闭时都会提示是否保存。通过打开菜单、最近文件以及单击工具栏按钮等,都能够打开保存过的.md文件。甚至双击保存好的.md文件,或者把文件拖到框架上面,也能自动打开一个文档。
CDocument类最常用的虚函数回调如下。
①CDocument::OnNewDocument:创建新文档时回调。
②CDocument::OnCloseDocument:关闭文档时回调。
③CDocument::OnOpenDocument:打开已存在的文档时回调。
④CDocument::OnSaveDocument:保存文档到硬盘时调用。
⑤CDocument::DeleteContents:需要清理文档数据时调用。