上一章我们学会了使用Windows窗体实现自定义对话框,这里我们就来学习下如何创建Windows应用程序的菜单。
一个功能完善的Windows应用程序,必定离不开各种各样的菜单操作,而菜单又分为下来菜单和弹出菜单,如下图一所示就是IE中的菜单示例:
图一:IE上的下拉菜单和弹出菜单
由上面可见,下拉菜单是指窗口的菜单栏上的菜单;弹出菜单是指平常不显示在窗体上,在需要的时候才弹出显示的菜单,最常用的例子就是右键的弹出菜单。而无论是下拉菜单还是弹出菜单,它们都包括菜单项、菜单项的快捷键、菜单项之间的分隔符。现在我们清楚了菜单的结构了,那么下面我们就来看看怎么在vb.net中实现菜单的编程。
在vb.net中,下拉菜单对应的组件是MainMenu,弹出菜单对应的是ContextMenu。
一、菜单设计器设计MainMenu菜单
1、首先新建一个Windows应用程序项目。
2、把设计器的当前窗口切换Form1视窗设计界面(即Form1.vb(设计)),然后从“工具箱”中选中MainMenu组件,如下图二所示:
图二:MainMenu组件
3、把该组件拖放到Form1窗体上,在“组件栏”中就会出现一个Name为MainMenu1的控件,用鼠标选中它,单击鼠标右键,在弹出的菜单中选择“编辑菜单”,Form1窗体上的菜单就会显示出来并处于可编辑状态,如下图三所示:
图三:选中MainMenu1控件
?
本文作者: #p#副标题#e#4、在图三中,单击以蓝色显示的选中部分,输入“编辑(&E)”,如下图四所示,提示:"&"符号的作用是为菜单设定快捷键。
图四:编辑菜单项的文字
现在我们依次在"编辑"菜单下输入建立"复制","粘帖","剪切","查找"四个菜单项,如下图五所示
图五:建立一个简单的编辑菜单
5、我们发现,在通用的菜单栏中,菜单项目是分组的,即功能相似的菜单放在一个分栏里面,这样很直观,就像图五种的复制、粘贴、查找是属于文本编辑的,而查找是文字查询的,所以我们按习惯把它们分成两组去。一般的菜单分组是用一个分割线分开的,在vb.net中实现也很简单,首先在选中“查找”这个项,然后弹出鼠标右键,选择“插入分隔符号”,就会自动在选中的菜单项上面插入一个分割线,还可以选中“查找”菜单项,弹出鼠标右键,选择“新插入”,插入一个新的菜单项,然后在这个新菜单项中输入“-”,也可以起到分割的作用,如下图六所示:
图六:在菜单项间插入分割线
6、再看我们的菜单项,“剪贴”项在“粘贴”后面了,标准的编辑菜单中它都是排在第一位了,现在我们想把它移动到“复制”的上面怎么办呢?很简单呀,只要选中它,按着鼠标左键不放就可以拖放到适当的位置了。如下图七所示:
图七:拖动菜单项的位置
这样我们就完成了一个窗体上的简单的菜单了,更加复杂的菜单也是在这些基本的操作上完成的,剩下的工作就是为这些菜单项目设置合适的属性以及在click中添加响应的代码了。下面我们继续看怎么为菜单项在设计时设置状态属性。
一般来说,一个菜单项最常见的几种状态就是是否可见、是否可用、是否选中。
1、设置是否可见状态是在该菜单项属性窗口的Visible属性,False为运行时不可见。注意,该菜单如果设置为不可见,则它以下的所有子菜单项也是不可见的,所以我们可以通过设置一个父级的菜单让其下的所有菜单不可见
2、设置是否可用状态时在该菜单项属性窗口的Enabled属性,False为运行时不可用,即该菜单项变灰。注意:该菜单如果别设置为不可用的灰色状态,则无法弹出其所属的子菜单的来,所以其子菜单也是不可用的。
3、设置是否是选中状态,有两个属性影响到它,Checked属性指示菜单是否是选中的,默认为False;RadioCheck属性指示当菜单项选中的时候,标识菜单项选中的标记状态,默认为False。当菜单项的RadioCheck=False,Checked=true时,菜单项前面就会出现一个小对勾;当菜单项的RadioCheck=true,Checked=true时,菜单项前面就会出现一个小圆点
二、菜单设计器设计ContextMenu菜单
1、在工具箱中找到ContextMenu组件,选中并拖放到Form1窗体中,这样组件栏就就多了个ContextMenu1控件,如下图八所示:
图八:拖放ContextMenu组件
2、在组件栏中选中ContextMenu1控件,这时就会在Form1窗体的顶部显示出"上下文菜单"的字样来,如下图九所示:
图九:ContextMenu1控件的编辑状态
3、单击“上下文菜单”,在其下方显示的“请在此处输入”中输入要添加的菜单项,如下图十所示:
图十:添加新的菜单项
4、依次建立“剪切”、“复制”、“粘帖”三个菜单项,其大部分的设计都和MainMenu一样的。
5、选中Form1窗体,在属性窗口中找到它的“ContextMenu”属性,把该属性设置为ContextMenu1,注意,大部分的控件都有该属性,该属性直接对应的是右键快捷菜单的菜单名。
6、按F5运行,在Form1窗体上点击右键,是不是弹出上面我们设计好的右键菜单ContextMenu1来呢!
?
本文作者: #p#副标题#e#三、动态创建弹出菜单
上面我们学会了用设计器来设计窗体菜单和弹出菜单,但是要真正掌握菜单类的编程,光靠使用设计器还是远远不够的,我们还需要学会使用MainMenu类、MenuItem类和ContextMenu类来生成菜单。
MainMenu类表示的是下拉菜单的结构。在创建完MainMenu实例后,还需要把该实例绑定到要显示此菜单的Form中,下拉菜单才能够显示,而要实现这种绑定其实非常简单,只需把MainMenu实例分配给Form的Menu属性就可以了。
ContextMenu类表示当用户在控件或窗体的特定区域上单击鼠标右键时弹出的菜单结构。可视控件和Form窗体一般都有ContextMenu属性。要显示ContextMenu实例,只需把ContextMenu实例分配给要显示此弹出菜单的可视组件或Form窗体的ContextMenu 属性就可以了。多个组件可共同使用一个ContextMenu实例。
MenuItem类表示的是MainMenu和ContextMenu中的每一个菜单项。显示创建的MenuItem实例,必须使用MainMenu或ContextMenu中的“Add”方法把MenuItem实例加入。若要创建子菜单,可以使用父MenuItem实例的“Add”方法把MenuItem实例添加到其MenuItems属性中。MenuItem类还提供一些属性用以设定菜单项的外观和功能。若要显示菜单项旁边的选中标记,可以使用Checked 属性。Shortcut属性可用于设定此菜单项对应的键盘组合键。
下面我们就用代码来创建一个和图六中一样的下拉菜单。
1、首先把我们前面用菜单设计器设计的下来菜单删除了。在Form1的代码编辑器中加入AddMainMenu过程:
Public Sub AddMainMenu()
End Sub
2、创建一个MainMenu实例
Dim MainMenu1 As MainMenu = New MainMenu
3、创建菜单项"编辑"
Dim MenuItem1 As MenuItem = New MenuItem
MenuItem1.Text = "编辑(&E)"
同理分别创建菜单中的"剪切"、"复制"、"粘贴"、分隔符、"查找"五个子菜单项
Dim MenuItem2 As MenuItem = New MenuItem
MenuItem2.Text = "剪切"
Dim MenuItem3 As MenuItem = New MenuItem
MenuItem3.Text = "复制"
Dim MenuItem4 As MenuItem = New MenuItem
MenuItem4.Text = "粘帖"
Dim MenuItem5 As MenuItem = New MenuItem
MenuItem5.Text = "-"
Dim MenuItem6 As MenuItem = New MenuItem
MenuItem6.Text = "查找"
4、在MainMenu1实例中加入顶级菜单项MenuItem1
MainMenu1.MenuItems.Add(MenuItem1)
5、为顶级菜单项添加子菜单项
MenuItem1.MenuItems.Add(MenuItem2)
MenuItem1.MenuItems.Add(MenuItem3)
MenuItem1.MenuItems.Add(MenuItem4)
MenuItem1.MenuItems.Add(MenuItem5)
MenuItem1.MenuItems.Add(MenuItem6)
6、把MainMenu1实例关联到Form1窗体上
Me.Menu = MainMenu1
7、最后把AddMainMenu添加到Form1窗体的New过程中,如下所示:
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
AddMainMenu()
End Sub
本文作者: #p#副标题#e#
按F5运行,窗体加载完毕后,效果如下图十一所示
图十一:代码添加MainMenu菜单的效果
小技巧:我们经常见别人的应用程序中可以点击菜单项来去掉或者标记上选中的对勾,其实很简单,只需要在该菜单项的Click事件中加上如下代码即可。
Dim mm As MenuItem = CType(sender, MenuItem)
If mm.Checked = False Then
mm.Checked = True
Else
mm.Checked = False
End If
动态创建ContextMenu和MainMenu是一样的,唯一的区别在于Me.ContextMenu来捆定ContextMenu类的实例。
限于篇幅,我们这里只是讨论了菜单组件的基础使用,更多深入的知识需要我们不断去摸索,下一章,我们就一起去关注一下:vb.net入门——MDI 窗体的基础使用
本文作者: