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



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

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

我开始得出结论,问题可能是因为这是一个SDI接口。我想我最初认为,由于我使用了拆分器窗口,它将同时支持多个文档。

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

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

谢谢

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

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

这是一个老问题,但对于那些可能想做同样事情的人来说,MFC确实支持上面提到的场景。来自Microsoft文档:

MFC支持三种常见的用户界面,它们需要在同一文档上有多个视图。这些型号是:

  1. 查看同一类的对象,每个对象都在一个单独的MDI文档框架窗口中

您可能需要支持在文档上创建第二个框架窗口。用户可以选择"新建窗口"命令打开具有同一文档视图的第二个框架,然后使用这两个框架同时查看文档的不同部分。该框架通过复制附加到文档的初始框架窗口和视图,支持MDI应用程序的"窗口"菜单上的"新建窗口"命令。

  1. 在同一文档框架窗口中查看同一类的对象

拆分器窗口将单个文档窗口的视图空间拆分为文档的多个独立视图。该框架从同一视图类创建多个视图对象。有关详细信息,请参见拆分器窗口。

  1. 在单个框架窗口中查看不同类的对象

在此模型中,拆分器窗口的变体,多个视图共享一个框架窗口。视图是由不同的类构造的,每个视图都提供了查看同一文档的不同方式。例如,一个视图可能以正常模式显示文字处理文档,而另一个视图则以大纲模式显示。拆分器控件允许用户调整视图的相对大小。

Microsoft MFC引用

https://learn.microsoft.com/en-us/cpp/mfc/multiple-document-types-views-and-frame-windows?view=msvc-170

https://learn.microsoft.com/en-us/cpp/mfc/multiple-document-types-views-and-frame-windows?view=msvc-170#_core_splitter_windows

MFC样本

https://learn.microsoft.com/en-us/cpp/overview/visual-cpp-samples?view=msvc-170#mfc样本

MFC拆分器样本

https://github.com/microsoft/VCSamples/tree/master/VC2010Samples/MFC/general/viewex