2009-10-21 26 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)時進行處理並放置返回以防止操作生效。