我有一个表单,它是一个 mdicontainer,顶部有一个菜单条。我将一个子窗体添加到我的 mdi 容器中,当我最大化子窗体时,它在菜单条上最大化。我想知道如何限制孩子在菜单条下方最大化。任何帮助,将不胜感激。
3 回答
您的子表单正在以 MDI 中子表单应该最大化的方式最大化。它并没有真正覆盖父窗体的菜单条 - 它实际上是将自己的菜单条与父窗体的菜单条合并。
要使子窗体仅占用 MDI 父级中的可用子区域(而不是将其菜单与父级菜单合并),请将以下代码放入子窗体的 Resize 事件中:
if (this.WindowState == FormWindowState.Maximized)
{
this.WindowState = FormWindowState.Normal;
this.Size = this.MdiParent.ClientSize;
this.Location = new Point(0, 0);
}
这将阻止子窗口实际最大化。
我说“类似这段代码”是因为这个片段不能完全正确地工作。父窗体的ClientSize
属性给出窗体的整体大小,而您只想使用 MDI 客户区的大小。我不知道如何做到这一点,而且显然这并不容易。看到这个问题:
您可以设置 MaximumSize 属性,使其不会填满整个容器。
我知道这是一个老问题,但我刚刚在我正在从事的一个老项目中遇到了这个问题,所以这里有一个答案给任何看到这个的人。将 Dock 设置为 DockStyle.Fill 将为您提供所需的行为。
请注意,如果您尝试在具有 DockStyle 的情况下重新定位或调整窗口大小,该窗口的行为/看起来会很奇怪。
为此,我订阅了 MDI 客户端窗口的调整大小事件,如果窗口刚刚被最大化,我将其 DockStyle 设置为 Fill,将 FormBorderStlye 设置为 FixedDialog(以防止调整大小),并将窗口状态设置为正常以防止最大限度地避免发生。
为了防止用户在窗口处于这种“最大化状态”时移动窗口,我简单地覆盖了 WndProc 方法并在窗口被移动时进行处理(SC_MOVE)并放置一个返回以防止操作生效。