12. 结合上一节介绍的方法,通过Visual Basic .Net的菜单设计器,按照图08和图09所示的菜单结构设计菜单。
图08:【MDI编程】项目的菜单结构之一
图09:【MDI编程】项目的菜单结构之二 13. 在利用菜单设计器设计完菜单后,分别在窗体中双击"新建"、"退出"、"层叠显示"、"横行平铺"、"纵向平铺"和"排列图标"菜单项,这样Visual Basic .Net会在Form1.vb文件中分别产生这些菜单项的Click事件对应的处理代码。
14. 设定Form1的"IsMdiContainer"属性值为"True",这把Form1窗体定义为MDI窗体容器,这一步设置是后面编程的基础,当设置此属性值后,Form1的窗体也发生了改变,图10是设置此属性后的窗体模样:
图10:把Form1窗体设置为MDI窗体容器后的模样 15. 选中图03中的"窗口"菜单项,并设置此菜单项的"MdiList"属性值为"True"。其作用是当程序运行后,如果新建了一个MDI窗体,就会在"窗口"菜单项后,自动加入一个以新建MDI窗体名称命名的菜单项,如果新建了多个MDI窗体,则会在"窗口"菜单项后,会加入以这些MDI窗体名称命名的菜单项。当MDI窗体被关闭,那些以此MDI窗体命名的菜单项也会自动删除。具体可图06所示。
16. 把Visua Basic .Net的当前窗口切换到Form1.vb的代码编辑窗口,并在定义Form1中组件的代码区加入下列代码,下列代码是定义一个变量,此变量用以统计程序中新建MDI窗体的数量:
Private iFormCount As Integer = 1
17. 用下列代码替换Form1.vb中的MenuItem2的Click事件对应的处理代码,MenuItem2即为图01中的"新建"菜单项,下列代码的作用是在新建一个MDI窗体:
Private Sub MenuItem2_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem2.Click
Dim frmTemp As Form = New Form ( )
'新建一个窗体
frmTemp.MdiParent = Me
'为当前创建的窗体设置MDI父窗体
frmTemp.Text = "MDI窗体" + iFormCount.ToString ( )
iFormCount = iFormCount + 1
frmTemp.Show ( )
'把此MDI窗体显示出来
End Sub
18. 用下列代码替换Form1.vb中的MenuItem3的Click事件对应的处理代码,MenuItem3即为图08中的"退出"菜单项,下列代码的作用是退出应用程序:
Private Sub MenuItem3_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem3.Click
Application.Exit ( )
'退出应用程序
End Sub
19. 用下列代码替换Form1.vb中的MenuItem5的Click事件对应的处理代码,MenuItem5即为图09中的"层叠显示"菜单项,下列代码的作用是层叠排列窗体中的所有MDI窗体:
Private Sub MenuItem5_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem5.Click
Me.LayoutMdi ( MdiLayout.Cascade )
'层叠排列窗体中的所有MDI窗体
End Sub
20. 用下列代码替换Form1.vb中的MenuItem6的Click事件对应的处理代码,MenuItem6即为图09中的"水平平铺"菜单项,下列代码的作用是水平平铺窗体中的所有MDI窗体:
Private Sub MenuItem6_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem6.Click
Me.LayoutMdi ( MdiLayout.TileHorizontal )
'水平平铺窗体中的所有MDI窗体
End Sub
21. 用下列代码替换Form1.vb中的MenuItem7的Click事件对应的处理代码,MenuItem7即为图09中的"垂直平铺"菜单项,下列代码的作用是垂直平铺窗体中的所有MDI窗体:
Private Sub MenuItem7_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem7.Click
Me.LayoutMdi ( MdiLayout.TileVertical )
'垂直平铺窗体中的所有MDI窗体
End Sub
22. 用下列代码替换Form1.vb中的MenuItem9的Click事件对应的处理代码,MenuItem9即为图09中的"排列图标"菜单项,下列代码的作用是窗体中的所有MDI窗体排列图标:
Private Sub MenuItem9_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem9.Click
Me.LayoutMdi ( MdiLayout.ArrangeIcons )
'窗体中的所有MDI窗体排列图标
End Sub
至此【MDI编程】项目的全部工作就完成了,图11、图12和图13是程序运行后的界面
图11:【MDI编程】运行界面之一
图12:【MDI编程】运行界面之二
图13:【MDI编程】运行界面之三 此时我们注意到图13所示的"窗口"菜单中增加许多子菜单,而在程序设计时,并没有处理这些功能的代码。这是由于第十一步中设置"窗口"菜单项的 "MdiList"属性值为"True"造成的,可见正确的设置组件的属性值有时的确能够代替烦杂的代码编写工作。
五:总结: 本文主要内容有二个,其一是介绍的在Visual Basic .Net定制不规则窗体的实现方法。在Visual Basic .Net中创建不规则窗体主要使用的是Region类和GraphicsPath类。GraphicsPath主要是绘制窗体的形状,Region主要是以GraphicsPath来构建窗体。结合本文的实现思路和具体方法,我想对于其他形状的窗体,在掌握GraphicsPath类提供的使用方法的前提下,加上对所要创建不规则窗体的规划设计,用Visual Basic .Net实现起来应该不算很困难。
本文的另外一个主要内容就是介绍在Visual Basic .Net编写MDI应用程序的基本过程、技巧和注意事项。通过本文的介绍可见Visual Basic .Net的MDI编程并没有什么复杂的地方,只需了解一些对MDI窗体处理的方法及其调用方式,当然更重要的是要了解并掌握某些组件的针对MDI的属性及其设置方式。