而OnInitialUpdate函数可以被调用很多次。这就是两者的区别。
在本程序中,我们使用缺省的基类函数就够了。
到现在为止,多文本编辑器已经编写完成了。我们可以同时打开多个文本进行编辑,也可以对一个文本打开多个视图窗口。试着运行这个程序,并测试我们叙述的各项功能。虽然它的功能还不多,但是已经包括了文档/视图结构提供的各项基本的功能了。
本章论述的重点是MFC的一种重要的编程模式——文档/视图结构。
文档/视图结构的实质就是将数据从数据的显示和用户对数据的操作中分离出来。在这种模式下,一个文档对象读和写数据并保存数据。文档同时为现存的数据提供一个访问的界面给视图。而单独的视图对象负责数据的显示,将数据放入一个窗口供用户选择和操作。视图对象从文档中获取显示数据,并将任何数据的变化通知文档。
采用文档/视图结构使我们能够很容易支持多个视图窗、多个文档类型、分离窗口以及许多其它有用的用户界面特性。它的核心内容是四个类:
n CDocument:文档类
n CView :视图类
n CFrameWnd :框架窗口类
n CDocTemplate:文档模板类
我们分别介绍了四个类的定义和功能。文档类用于存储数据,视图类用于显示数据和接收用户输入,框架窗口类用于包含窗口和提供必要的用户界面(如菜单,工具条和状态条),文档模板类则将定义了文档类、视图类和框架窗口之间的联系,并且直接创建框架窗口和视图窗口。
我们提供了两个例子。一个为单文档应用,一个为多文档的应用。两者的最大不同就是前者在程序运行期间只允许打开一个文档对象和一个视图窗对象,而后者可以打开多个文档对象和视图窗对象。
第一个例子为单文档的编辑器。我们在其中介绍了应用框架在执行应用程序时的大致流程,剖析了由AppWizard自动生成的单文档程序中对上述四个类是如何使用的。然后介绍了键盘消息的处理。我们向视图中加入了数据成员,然后用视图类的成员函数GetDocument的到了指向文档的指针,以便于对文档进行操作。
第二个例子为多文档的编辑器。我们主要处理了文档的所有视图显示不一致的问题。这可以通过处理视图类函数OnUpdate和文档类函数UpdateAllViews来解决。重新编写了OnDraw函数来处理视图的重画。
两个例子的主要程序清单都被给出,用户如果有不懂的地方可以参见清单。