首页 理论教育基于文档模板的序列化存储技巧

基于文档模板的序列化存储技巧

【摘要】:文档模板类将视图类、文档类和框架类捆绑在一起。文档模板将类型信息在注册表中进行注册,使得在双击文档类型的文件时,操作系统根据注册信息找到执行文件启动进程并加载该文档。创建一个工程名为“md”的MDI程序,开发基于文档模板架构的绘图软件。图13-8 创建文档视图架构的程序2)在向导第4步,单击“Advanced”按钮填写文档信息,如图13-9所示。11)修改CRectan类的源文件,编写所有类成员函数的代码。21)在CMdDoc类中修改序列化函数的代码。

“模板”提供一种固定的样式,其大部分内容都是内部开发好了的,开发者只要作少量修改即可快速生成功能强大的软件。文档模板类(CDocTemplate)将视图类(CView)、文档类(CDocument)和框架类(CFrameWnd)捆绑在一起。文档模板将类型信息在注册表中进行注册,使得在双击文档类型的文件时,操作系统根据注册信息找到执行文件启动进程并加载该文档。

创建一个工程名为“md”的MDI程序,开发基于文档模板架构的绘图软件。

1)在向导第1步,选择多文档和文档视图框架,如图13-8所示。

978-7-111-46378-8-Chapter13-22.jpg

图13-8 创建文档视图架构的程序

2)在向导第4步,单击“Advanced”按钮填写文档信息,如图13-9所示。

978-7-111-46378-8-Chapter13-23.jpg

图13-9 文档模板设置

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

978-7-111-46378-8-Chapter13-24.jpg

图13-10 MFC应用程序向导

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

978-7-111-46378-8-Chapter13-25.jpg

图13-11 选择视图基类(共有8个类可选)

5)在ResourceView中修改工具栏资源,添加一些工具按钮,如图13-12所示。

978-7-111-46378-8-Chapter13-26.jpg

图13-12 编辑工具栏资源

6)部分工具栏按钮ID见表13-2。

表13-2 部分工具栏按钮ID

978-7-111-46378-8-Chapter13-27.jpg

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

978-7-111-46378-8-Chapter13-28.jpg

图13-13 通过右键菜单添加新类

8)修改CLayer类的头文件,使其成为一个抽象类。

978-7-111-46378-8-Chapter13-29.jpg

978-7-111-46378-8-Chapter13-30.jpg

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

978-7-111-46378-8-Chapter13-31.jpg

图13-14 添加派生类

10)修改CRectan类的头文件,重写所有基类中的虚函数并添加成员变量

978-7-111-46378-8-Chapter13-32.jpg

978-7-111-46378-8-Chapter13-33.jpg

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

978-7-111-46378-8-Chapter13-34.jpg

978-7-111-46378-8-Chapter13-35.jpg

12)修改CLayer类的源文件。

978-7-111-46378-8-Chapter13-36.jpg

978-7-111-46378-8-Chapter13-37.jpg(www.chuimin.cn)

13)修改CMdView类的头文件,添加一些成员变量。

978-7-111-46378-8-Chapter13-38.jpg

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

978-7-111-46378-8-Chapter13-39.jpg

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

978-7-111-46378-8-Chapter13-40.jpg

图13-15 添加工具栏按钮的消息映射函数

16)修改添加的消息映射函数的代码。

978-7-111-46378-8-Chapter13-41.jpg

978-7-111-46378-8-Chapter13-42.jpg

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

978-7-111-46378-8-Chapter13-43.jpg

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

978-7-111-46378-8-Chapter13-44.jpg

图13-16 添加消息映射函数

19)修改建立的所有消息映射函数的代码。

978-7-111-46378-8-Chapter13-45.jpg

978-7-111-46378-8-Chapter13-46.jpg

978-7-111-46378-8-Chapter13-47.jpg

20)修改OnDraw函数的代码。

978-7-111-46378-8-Chapter13-48.jpg

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

978-7-111-46378-8-Chapter13-49.jpg

978-7-111-46378-8-Chapter13-50.jpg

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

978-7-111-46378-8-Chapter13-51.jpg

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

978-7-111-46378-8-Chapter13-52.jpg

图13-17 查看运行结果

每次绘制新的矩形或者拖动一个矩形,关闭时都会提示是否保存。通过打开菜单、最近文件以及单击工具栏按钮等,都能够打开保存过的.md文件。甚至双击保存好的.md文件,或者把文件拖到框架上面,也能自动打开一个文档。

CDocument类最常用的虚函数回调如下。

①CDocument::OnNewDocument:创建新文档时回调。

②CDocument::OnCloseDocument:关闭文档时回调。

③CDocument::OnOpenDocument:打开已存在的文档时回调。

④CDocument::OnSaveDocument:保存文档到硬盘时调用。

⑤CDocument::DeleteContents:需要清理文档数据时调用。