在MDI C# Winforms中,是否可以更改最小化窗口的大小?

3


用户抱怨在MDI容器中有多个最小化的窗口时,除非他们还原每个窗口,否则无法区分它们。我想知道是否可以使最小化的窗口稍微变宽,以便标题中的文本可以包含6个字符?
提前致谢!


有没有解决方法?比如说,当鼠标悬停在最小化的窗体上时,是否可以显示一个工具栏? - StuffHappens
“toolstrip”是指“tooltip”吗?是的,这是一个选项,虽然不是非常优雅的选项。或者你可以教他们使用“窗口”菜单,该菜单列出了所有打开的窗口及其完整名称(并允许切换)。 - Cody Gray
我认为您可以使用Windows菜单作为解决方法,这将帮助用户获取所有子窗口。- 设置menustrip的MDIWindowListItem属性。 - Anuraj
3个回答

7
不,这是不可能的。Windows使用当前系统参数确定最小化窗口的宽度,并且没有办法在不更改整个系统的值的情况下动态更改单个应用程序的宽度。
具体来说,所有最小化窗口的默认大小为160x31。在MDI应用程序中,您实际上可以看到此大小,因为窗口被最小化到其MDI主机中,而不是Windows任务栏中。微软Windows Shell团队的开发人员Raymond Chen之前发布了几篇博客文章,解释了为什么选择了这种特定的大小以及其含义。第一篇文章在这里:为什么最小化的窗口具有160x31的表面大小? 而第二篇后续文章则可在此处阅读:不,真的,为什么是160x31? 正如他在第二篇文章中所解释的那样:
小型标题栏的宽度由MINIMIZEDMETRICS结构的iWidth成员确定。您可以通过SystemParametersInfo函数检索和更改此结构。(分别使用SPI_GETMINIMIZEDMETRICSSPI_SETMINIMIZEDMETRICS标志。)有些人会提到MinWidth注册表值,但这些人是错误的。请注意,例如,操纵MinWidth需要注销周期,而使用SPI_SETMINIMIZEDMETRICS会立即生效。这是因为SPI_SETMINIMIZEDMETRICS更新了内部状态变量,而捣鼓注册表只是改变了数据库中的一个值,一旦您登录后就没有人关注它。
那高度呢?那只是标题栏的高度,您可以从“显示”控制面板的“外观”选项卡中进行调整。(在编程上,您可以使用那个有用的SystemParametersInfo函数,这次使用NONCLIENTMETRICS结构的iCaptionHeight成员。)


由于我怀疑您的用户真的不希望您通过P/Invoke SystemParametersInfo函数 来干扰他们的默认系统参数,因此您没有太多选择。我的建议是,特别是如果他们一次只使用一个窗口并将其他窗口最小化,则切换到另一种界面。MDI的目的是允许用户平铺或级联多个窗口,以便他们可以同时查看多个窗口。由于听起来这不是典型的用例,您可能最好都改为使用选项卡的应用程序。这通常称为选项卡文档界面(TDI),是旧的多文档界面(MDI)的更现代实现。多年来它变得非常流行;请查看维基百科文章


0
对于那些和我有同样问题的人,我找到了解决方案:
(win+r) regedit HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics 添加字符串值“MinWidth”。
更改名为“MinWidth”的字符串值。使用以下公式设置其值: -15 *像素宽度
对我来说,可接受的值是-3300。
小缺点:它还会改变任务栏中最小化窗口的大小(当任务栏中只有几个窗口时,使它们变得更宽)。

这并没有解决问题。你不应该假设用户为了这个特定的情况更改他们的Windows注册表设置。 - MasterWil

0
尽管这篇文章已经11年了,但我正在尝试解决一个问题:我的Windows11中的应用程序最小化窗口出现了问题(肯定是由某个软件引起的,但我不知道是哪个...)。这些应用程序最小化窗口比它应该有的要窄得多。与其包含标题和3个按钮的最小化标题栏不同,我只能看到关闭按钮。你在这里说过对于单个软件来说无法更改此大小,但我认为你知道(知道)如何在整个系统中更改它?这里是UltraEdit中的问题截图1,以及例如3dsMax中的问题截图2

如果您有新的问题,请通过单击提问按钮来提出。如果它有助于提供上下文,请包含此问题的链接。- 来自审核 - cboden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接