MFC 拆分器窗口中的多个文档/视图

Posted

技术标签:

【中文标题】MFC 拆分器窗口中的多个文档/视图【英文标题】:Multiple Documents/Views in MFC Splitter Window 【发布时间】:2017-01-31 12:41:49 【问题描述】:

我目前有一个在 Open GL 中显示数据的 MFC SDI 程序。我正在尝试修改程序以使用拆分器窗口一次显示多个数据文件。换句话说,如果有四个拆分窗口,每个窗口都显示不同的文件。

到目前为止,我发现的所有示例都只在多个视图中显示一个文档,但我需要一次显示多个文档。

我开始断定问题可能是因为这是一个 SDI 接口。我想我最初认为,由于我使用的是拆分器窗口,它会同时支持多个文档。

所以我的第一个问题是,SDI 接口有问题吗?我一次只能使用一个文件吗?

如果答案是我需要使用 MDI,那么我可以使用拆分器在一个 MDI 视图中显示多个文档,还是必须打开多个 MDI 窗口?

谢谢

【问题讨论】:

听起来您应该使用 MDI 界面重新启动项目。 :) MDI 是处理/查看多个文档所必需的(SDI 只创建一个文档对象)。基本上有两种实现方式,MDI 子窗口(每个文档对象一个)和选项卡式视图。从未见过使用拆分器窗口显示多个文档(每个窗格中一个)的应用程序。它看起来很不标准,如果您自己承担实现框架的任务,您将不得不解决诸如如果您必须显示 3 或 4 个文档,或者用户打开另一个文档时如何拆分客户区的问题- 大量规范和实施工作! 我们的一个 MDI 应用程序在每个拆分中针对不同的文档/视图类型使用拆分器窗口。非常可行(虽然不是默认的 MDI 应用程序,因为每个文档都是一个单独的文件,但我们的是一个包含不同“CDocument”派生类的单个磁盘文件)。 谢谢。在花了几个小时研究这个之后,似乎拆分器窗口旨在支持同一文档的多个视图,而不是我想要做的。我走这条路线的一个原因是这是客户要求的,但我可能可以说服他们改为走 MDI 路线。 换一种方式来问这个问题,如果我有一个应用程序可以同时显示多个图像,比如在 Lightroom 中,该怎么办?它一次显示多个文件,但它似乎不是 MDI 界面。那么如何实现这样的事情呢?我考虑过使用固定窗口大小的基于对话框的应用程序,但这仍然不能解决一次打开多个文档的问题。也许另一种可能性是取消 Doc/View 并编写我自己的控制器。每次用户打开文件时,我都会将其添加到列表中并将其定向到其中一个窗口。 【参考方案1】:

我认为创建多个 MDI 子窗口应该是非常可接受的,因为它们功能齐全(它们可以最大化、关闭或平铺)。你也可以发布一个 Window->Tile 命令,只要你的应用程序进入空闲状态(yields);他们将完全占据客户区。您甚至可以更深入地为您的 CMDIChildWnd 派生类提供一些自定义,例如禁用关闭、移动或调整大小,或者具有更短或自定义或没有标题栏(您可能需要自定义非客户区消息处理)。还可以尝试使用 WS_EX_TOOLWINDOW 扩展窗口样式(但不确定这是否适用于 MDI 子窗口,您必须至少在 Windows 8/10 和 7 下对其进行测试)。

另一种解决方案可能是最初创建一个带有选项卡视图的 MDI 应用程序,并自定义容纳选项卡的窗口,以便它们不是...实际上是选项卡,只是简单的非重叠子窗口(您必须将它们安排在客户区自己)。如果视图窗口具有“固定”大小(设置大小或由文档数据确定,例如图像大小)并且不应(由用户)调整大小,则这可能是优选的。然后也应该自定义 MainFrame 窗口,以在显示所有视图所需的区域超出其客户区域时显示滚动条。但这需要做很多工作,因为您需要修改窗口类以提供 MFC 最初不支持的功能,并深入挖掘 MFC 源代码。

【讨论】:

以上是关于MFC 拆分器窗口中的多个文档/视图的主要内容,如果未能解决你的问题,请参考以下文章

MFC单文档多视图程序设计与Splitter拆分窗口

单个文档 Windows 应用程序中的多个“窗格”视图

mfc 单文档 多文档 对话框 区别

如何把一个word文档按照标题拆分若干个文档?

MFC单文档 添加 多视图

MFC体系结构