在有限的区域内最大化儿童mdi

时间:2009-10-21 22:31:04

标签: c# mdiparent mdichild

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

3 个答案:

答案 0 :(得分:2)

您的儿童表格正在最大化,因为儿童形式应该在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客户端区域的大小。我不知道怎么做到这一点,显然这并非超级简单。看到这个问题:

Size/Location of Winforms MDI Client Area

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我知道这是一个古老的问题,但我刚刚在一个正在研究的旧项目中碰到了这个问题,所以这里有个人看到这个问题的答案。将Dock设置为DockStyle.Fill将为您提供所需的行为。

请注意,如果您尝试在具有DockStyle的情况下重新定位或调整窗口大小,窗口将会显得很奇怪。

为了实现这一点,我订阅了MDI客户端窗口的resize事件,如果窗口刚刚最大化,我将其DockStyle设置为Fill,将FormBorderStlye设置为FixedDialog(以防止调整大小),并将窗口状态设置为normal防止最大化发生。

为防止用户在处于“最大化状态”时移动窗口,我只需覆盖WndProc方法并在移动窗口时进行处理(SC_MOVE)并放置一个返回以防止操作生效。 / p>