MDI窗体在多文档Windows应用程序中有着举足轻重的地位,目前流行的Maxthon浏览器就是代表之一,MDI子窗体的创建避免了用户打开很多窗
口的时候任务栏中挤满了让人眼花缭乱的窗体。
切入正题,我们现在就来看如何创建和应用MDI窗体。
一、如何创建MDI父窗体和子窗体。
1、建立一个默认空白的Windows应用程序,在Form1窗体的属性窗口中找到IsMDIContainer 属性,设置为 True,如下图一所示:
2、从工具箱上拖放MainMenu组件放到作为父窗体的Form1窗体上(关于MainMenu菜单的使用请参看该文:vb.net入门——Windows窗体中的菜单操作),建立如下顶级菜单项“文件(&F)”和“窗口(&W)”,然后再在“文件” 菜单项下建立子菜单项“新建(&N)”和“退出(&E)”,各个菜单项的Name属性为:
“文件”——mFile
“新建”——mNew
“退出”——mClose
“窗口”——mWindows
如下图二所示:
3、在vs的菜单——项目——添加Windows 窗体,为项目添加一个新的窗体Form2作为创建子窗体的模板。
4、返回父窗体Form1中,为它的菜单项添加代码。
首先双击子菜单“新建”,编辑器自动切换到该菜单项的默认事件中,我们为它添加如下代码:
Dim NewMDIChild As New Form2
NewMDIChild.MdiParent = Me
NewMDIChild.Show()
NewMDIChild.Text = "子窗体" & (Me.MdiChildren.GetUpperBound(0) + 1).ToString
注意:在以上代码最后一行中的Me.MdiChildren指示的是某个父窗体中所有子窗体的数组,我们在编程的时候可以使用该属性来检索父窗体下的子窗体。
为子菜单项“退出”的Click事件添加如下代码:
Application.Exit()
现在我们就简单建立MDI窗体的应用程序,按F5运行,从“文件”菜单中,选择“新建”创建新 MDI 子窗体。运行效果如下图三所示:
二、显示MDI窗口列表
用过带有子窗体的程序的朋友一定知道,很多程序都带显示它它本身打开的子窗体列表的功能,如下图所示:
其实在vb.net中,我们也可以在我们自己的程序中实现这个功能。现在回到父窗体Form1中,找到刚才我们创建的菜单项“窗口”,在它的属性窗口中找到MdiList,设置为True,如下图五所示:
现在按F5运行,用“新建”菜单多建几个子窗体,然后单击“窗口”菜单就可以看到我们打开的所有子窗体列表了,如下图五所示:
提示:当前的活动子窗体使用一个小对勾标记,我们还可以在显示的列表中切换活动窗口。
我们可以通过ActiveMDIChild获取当前活动的子窗体,通过ActiveControl属性获得子窗体活动的控件。
三、排列子窗体
我们可以通过MDILayout方法来实现子窗体的排列。
1、首先我们回到父窗体Form1中,然后在刚才的菜单项“窗口”下创建如下四个子菜单项:
Text属性 | Name属性 |
---|---|
排列窗口 | mLayout1 |
层叠窗口 | mLayout2 |
垂直平铺 | mLayout3 |
水平平铺 | mLayout4 |
2、在代码编辑器中加入如下代码:
3、按F5运行,在“窗口”菜单中点击对应的菜单项看效果。
到了这里,我们基本上在我们的程序中使用MDI窗体了,我们下一章就一起去看下:vb.net入门——在 Windows 窗体中执行拖放操作
Private Sub mLayout1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mLayout1.Click
Me.LayoutMdi(MdiLayout.ArrangeIcons)
End Sub
Private Sub mLayout2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mLayout2.Click
Me.LayoutMdi(MdiLayout.Cascade)
End Sub
Private Sub mLayout3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mLayout3.Click
Me.LayoutMdi(MdiLayout.TileVertical)
End Sub
Private Sub mLayout4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mLayout4.Click
Me.LayoutMdi(MdiLayout.TileHorizontal)
End Sub