2010-02-17 157 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