2010-02-17 150 views
0

我有一個Windows窗體應用程序可以打開MDI子窗體。當我選擇這些表單時,我需要設置或渲染其窗口狀態爲最大化。問題是,當我在打開的窗體之間導航時,它會恢復到正常的窗口狀態,並且當我將窗口狀態再次設置爲最大時,它會顯示從正常狀態到最大化狀態的轉換,並且看起來不太好。有關設置Windows窗體窗口窗口狀態的提示

如何創建具有MDI父窗體的Windows應用程序,以最大化窗口狀態打開許多MDI子窗體?

+0

是的,很明顯,但讓我問你:你是否願意使用MDI的替代品,並「放棄」你現在使用的MDI的其他「特徵」?我認爲,如果你確切地說你(或者運行時最終用戶)如何在「開放表單之間導航」:通過MDI Parent表單上的菜單,這也很有價值?要麼 ... ? – BillW

+0

是的。在家長中,有一個菜單可以選擇孩子。我可以使用什麼替代方案?它是tabcontrol? –

+0

因此,在「放棄」MDI「功能」時,對於您最小化「子」表單(設置爲MDIParent表單的表單的MDIParent屬性)的情況,您沒有任何問題,它會下降到父MDI的底部TitleBar可見的形式?您是否正在使用MDI的「自動窗口菜單功能」:http://msdn.microsoft.com/en-us/library/ms171654(VS.100).aspx?如果你把MDI放在後面,沒問題嗎? – BillW

回答

3

下面是基於使用MDI答案「父窗體和子窗體的範例,」基於以下假定:

  1. 你有一個MenuStrip控件「碼頭=‘頂你的MDIParentForm,和你’ How to: Create an MDI Window List with MenuStrip

  2. 要創建新的子窗體的是:

    一中描述VE實現自動MDI &窗口菜單句柄。沒有MaximizeBox,MinimizeBox等,但可能有ControlBox(用於關閉它們)

    b。這些兒童形式可能是可調整的或不可調整的:我們不會考慮這裏的含義。

  3. 您希望這些MDIChildForms在MDIParent窗體中顯示爲最大化,但不能遮蔽MDIParentForm的菜單。

好了:假設你有你的所有子窗體完全設計好,「伺機而動」:我們可能會看到一些像這樣的代碼在你的MDIParentForm代碼:

// create instances of your child forms 
    Form2 f2 = new Form2(); 
    Form3 f3 = new Form3(); 
    Form4 f4 = new Form4(); 
    Form5 f5 = new Form5(); 

    private void MDIParentForm1_Load(object sender, EventArgs e) 
    { 
     f2.Text = "subForm1"; 
     f3.Text = "subForm2"; 
     f4.Text = "subForm3"; 
     f5.Text = "subForm4"; 

     f2.MdiParent = this; 
     f3.MdiParent = this; 
     f4.MdiParent = this; 
     f5.MdiParent = this; 

     f2.Dock = DockStyle.Fill; 
     f3.Dock = DockStyle.Fill; 
     f4.Dock = DockStyle.Fill; 
     f5.Dock = DockStyle.Fill; 

     f2.Show(); 
     f3.Show(); 
     f4.Show(); 
     f5.Show(); 
    } 

在這一點上, dock style'填充應用於子窗體將使它們全屏,並防止遮擋MDIParentForm菜單:菜單將允許您自動選擇哪一個是最前面的。

現在,如果你想做更有趣的東西:比如調整孩子的形狀,平鋪他們,把他們串起來。您將不得不更改這些子窗口的Dock屬性:然後您可以使用內置的MDI範例窗口來安排設施,如下所述:How to: Arrange MDI Child Forms

如果要創建多個實例一種預定義的子窗體:How to Create MDI Child Forms ...查看關於如何使用「新菜單項」的示例:可能證明有用。

3

如果您希望窗口狀態始終最大化,我建議從MDI窗體切換。在這種情況下,TabControl可能會更好。

MDI表單有很多可用性問題,這就是爲什麼它們不再常用,並且傾向於被其他控件/選項所取代。

+0

tabcontrol的問題是,我有很多每個子窗體使用的控件。 –

+1

這是一個問題,因爲...?您可以將這些放入UserControl中,並將每個UserControl放置在一個選項卡中。您甚至可以在顯示選項卡時按需創建它們,並且它將具有與MDI表單相同(或更低)的開銷。 –

0

閱讀蘆葦答案,尤其是你的意見後:

問題TabControl的是,我有一個 很多每個孩子形式

使用的控制也許這將幫助: 不要將您的控件放入Winform。而是將它們封裝到UserControl(也許它已經通過將您的繼承從Form更改爲UserControl)工作。

現在將每個UserControl放在它自己的TabPage上並將其Dock屬性設置爲Fill。現在,您可以自行更改每個用戶控件,而不會干擾另一個TabPage上的另一個控件(只要您不在任何連接中)。

+0

表單也可以在TabPages中使用,沒有任何問題(您可能需要關閉不需要的Form可視元素):但是,由於UserControls的「更輕」,也許這是實現它的最佳方式。一旦UserControl(或Form)被添加到TabPage的Controls集合中,您只能訪問頂層屬性:如果更改「源」UserControl或Form:則需要重新構建項目(不是什麼大問題)。我的習慣是在「主窗體」的Form Load事件代碼中填充TabPages(如果它們只用於保存UserControl),但這只是個人偏好。 – BillW