文档/视图创建中介绍了文档、视图和框架窗口之间的标准关系。 许多应用程序支持单个文档类型(但可能有多个打开的该类型的文档),文档上只有一个视图,每个文档只有一个框架窗口。 但某些应用程序可能需要更改其中一个或多个默认值。
想要详细了解哪些内容
多个文档类型
MFC 应用程序向导会为你创建一个文档类。 但在某些情况下,可能需要支持多个文档类型。 例如,应用程序可能需要工作表和图表文档。 每个文档类型都由自己的文档类表示,也可能由自己的视图类表示。 当用户选择“文件新建”命令时,框架将显示一个对话框,其中列出了受支持的文档类型。 然后,它会创建用户选择的类型的文档。 每个文档类型都由其自己的文档模板对象管理。
若要创建额外的文档类,请参阅 “添加类”。 选择 CDocument 作为派生自的类类型,并提供请求的文档信息。 然后实现新类的数据。
若要让框架了解额外的文档类,必须在应用程序类的 InitInstance 重写中添加对 AddDocTemplate 的第二次调用。 有关详细信息,请参阅 文档模板。
多个视图
许多文档只需要一个视图,但可以支持单个文档的多个视图。 为了帮助你实现多个视图,文档对象保留其视图的列表,提供用于添加和删除视图的成员函数,并提供 UpdateAllViews 成员函数,以便让多个视图知道文档的数据何时发生更改。
MFC 支持三个需要同一文档上多个视图的常见用户界面。 这些模型包括:
查看同一类的对象,每个对象位于单独的 MDI 文档框架窗口中。
你可能想要支持在文档上创建第二个框架窗口。 用户可以选择“新建窗口”命令以打开具有相同文档视图的第二个框架,然后使用这两个框架同时查看文档的不同部分。 该框架通过复制附加到文档的初始框架窗口和视图,支持 MDI 应用程序的“窗口”菜单上的“新建窗口”命令。
在同一文档框架窗口中查看同一类的对象。
拆分窗口将单个文档窗口的视图空间拆分为文档的多个单独视图。 框架从同一视图类创建多个视图对象。 有关详细信息,请参阅 拆分器 Windows。
在单个框架窗口中查看不同类的对象。
在此模型中,拆分器窗口的变体,多个视图共享单个框架窗口。 视图是从不同的类构造的,每个视图都提供了查看同一文档的不同方法。 例如,一个视图可能会在正常模式下显示字处理文档,而另一个视图则以大纲模式显示文档。 拆分器控件允许用户调整视图的相对大小。
下图分为 a、b 和 c 部分,按上面显示的顺序显示三个用户界面模型。
Multiple-View 用户界面
框架通过实现 New Window 命令并提供 类 CSplitterWnd 来提供这些模型,如 拆分器 Windows 中所述。 可以使用这些模型作为起点实现其他模型。 有关演示视图、帧窗口和拆分器不同配置的示例程序,请参阅 MFC 示例。
有关详细信息UpdateAllViews
,请参阅 MFC 参考和 Scribble 示例中的类 CView。
多个框架窗口
可以在 MDI 应用程序的“窗口”菜单上使用“新建窗口”命令在同一文档上创建第二个框架窗口。 有关详细信息,请参阅图 Multiple-View 用户界面的第一个模型。
拆分器 Windows
在拆分器窗口中,窗口可以拆分为两个或多个可滚动窗格。 滚动条旁边的窗口框架中的拆分器控件(或“拆分框”)允许用户调整窗格的相对大小。 每个窗格都是同一文档上的视图。 在“动态”拆分器中,视图属于同一类,如图 b 部分所示,Multiple-View 用户界面。 在“静态”拆分器中,视图可以是不同的类。 这两种类型的拆分窗口都受 CSplitterWnd 类支持。
动态拆分器窗口(具有相同类的视图)允许用户将窗口拆分为多个窗格,然后滚动不同的窗格以查看文档的不同部分。 用户还可以取消拆分窗口以删除其他视图。 添加到 Scribble 示例 的拆分器窗口就是一个示例。 本主题介绍用于创建动态拆分器窗口的技术。 动态拆分器窗口显示在图 Multiple-View 用户界面的一部分。
静态拆分器窗口(具有不同类的视图)从窗口拆分为多个窗格开始,每个窗格都有不同的用途。 例如,在 Visual C++ 位图编辑器中,图像窗口并排显示两个窗格。 左侧窗格显示位图的生命大小图像。 右侧窗格显示同一位图的缩放或放大图像。 窗格由用户可以拖动的“拆分条”分隔开来更改窗格的相对大小。 静态拆分器窗口显示在图 Multiple-View 用户界面的 c 部分。
有关详细信息,请参阅 MFC 参考和 MFC 示例中的类 CSplitterWnd。