3

我有一个表单,它是一个 mdicontainer,顶部有一个菜单条。我将一个子窗体添加到我的 mdi 容器中,当我最大化子窗体时,它在菜单条上最大化。我想知道如何限制孩子在菜单条下方最大化。任何帮助,将不胜感激。

4

3 回答 3

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 客户区的大小。我不知道如何做到这一点,而且显然这并不容易。看到这个问题:

Winforms MDI 客户端区域的大小/位置

于 2009-10-21T23:55:19.847 回答
0

您可以设置 MaximumSize 属性,使其不会填满整个容器。

于 2009-10-21T22:32:34.623 回答
0

我知道这是一个老问题,但我刚刚在我正在从事的一个老项目中遇到了这个问题,所以这里有一个答案给任何看到这个的人。将 Dock 设置为 DockStyle.Fill 将为您提供所需的行为。

请注意,如果您尝试在具有 DockStyle 的情况下重新定位或调整窗口大小,该窗口的行为/看起来会很奇怪。

为此,我订阅了 MDI 客户端窗口的调整大小事件,如果窗口刚刚被最大化,我将其 DockStyle 设置为 Fill,将 FormBorderStlye 设置为 FixedDialog(以防止调整大小),并将窗口状态设置为正常以防止最大限度地避免发生。

为了防止用户在窗口处于这种“最大化状态”时移动窗口,我简单地覆盖了 WndProc 方法并在窗口被移动时进行处理(SC_MOVE)并放置一个返回以防止操作生效。

于 2015-07-16T16:04:14.133 回答