2009-10-21 69 views
3

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

回答

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

+0

男孩,三年后,我真的不知道我的意思是“它不是超级简单”,当我连接的答案给出了一个*超简单*的方法来确定这一点。 – MusiGenesis 2013-01-16 03:53:32

0

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

+0

它的工作原理除了它将它一直放在顶部并离开底部的开放空间。如果我将位置设置在菜单栏下方,它将首次运行,但在此之后它会再次将其重新放回顶部。 – 2009-10-21 22:38:50

0

我知道这一个老问题,但我只是碰到了这对旧项目我的工作,所以这里的任何人看到这个答案。将Dock设置为DockStyle.Fill将为您提供所需的行为。

请注意,如果您尝试在具有DockStyle的窗口重新定位或调整窗口大小时,该窗口将会显示/看起来很奇怪。

为了达到这个目的,我订阅了MDI客户窗口的resize事件,如果窗口刚被最大化,我将它的DockStyle设置为Fill,将FormBorderStlye设置为FixedDialog(以防止调整大小),并将窗口状态设置为正常以防止发生最大化。

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