Visual Basic .NET 菜单与上下文菜单创建指南
在 Visual Basic .NET 开发中,菜单和上下文菜单是应用程序与用户交互的重要组成部分。用户通过菜单和上下文菜单向应用程序发出各种命令,如打开、保存或关闭文件,打印文档,剪切、复制或粘贴文本等。本文将详细介绍如何在 Visual Basic .NET 中创建菜单和上下文菜单,以及如何为它们添加功能和增强特性。
菜单概述
在 Windows 应用程序中,菜单是一种常见的图形用户界面(GUI)元素,它为用户提供了向应用程序发出命令的途径。菜单具有以下优点:
-
逻辑层次组织
:程序员可以将相关命令组织在一个逻辑层次结构中。例如,文件操作相关的命令(如打开和保存)放在“文件”菜单下,编辑相关的命令(如剪切、复制和粘贴)放在“编辑”菜单下。
-
节省屏幕空间
:子菜单项在未选择其父菜单项时会折叠起来,避免显示不必要的命令,使应用程序界面保持整洁。
在 Visual Basic .NET 中,菜单是对象。
MainMenu
对象代表 Windows 窗体上的菜单,它包含一个
MenuItem
对象集合,每个
MenuItem
对象代表菜单上的一个项。每个
MenuItem
可以是一个命令,也可以是其他子菜单项的父菜单。
创建菜单
在 Windows 窗体上添加菜单有两种方式:设计时在 Windows 窗体设计器中添加,或在运行时通过编程方式添加。无论哪种方式,创建菜单都需要两个步骤:首先向窗体添加
MainMenu
对象,然后向其添加
MenuItem
对象。
设计时创建菜单
在设计时创建菜单的步骤如下:
1. 在 Windows 窗体设计器中打开要添加菜单的窗体。
2. 在工具箱中双击
MainMenu
组件。此时,窗体左上角下方会出现一个显示“Type Here”的矩形区域,并且
MainMenu
组件会添加到组件托盘中。
3. 点击“Type Here”文本,输入所需菜单项的名称来添加菜单项。如果“Type Here”文本未显示,可以通过点击 Windows 窗体上的
MainMenu
组件来显示它。
大多数顶级菜单项都有访问快捷键,用户可以通过按下
ALT
键和菜单项中的一个字母的组合来访问该菜单项。要添加快捷键,只需在要加下划线的字母前输入一个与号(
&
)。例如,输入“&File”作为初始菜单项,“File”中的“F”会加下划线,其快捷键为
ALT-F
。
在添加了“文件”菜单项后,“文件”菜单项下方和右侧会出现“Type Here”选项。可以在“文件”菜单项下方添加“打开”和“保存”等项,在“文件”菜单项右侧添加“编辑”菜单项,以与其他 Windows 应用程序保持一致。
如果忘记添加某个菜单项,可以右键单击要插入新菜单项之前的菜单项,然后从上下文菜单中选择“插入新项”。如果决定不包含某个菜单项,可以右键单击它并从上下文菜单中选择“删除”。
运行时创建菜单
在运行时通过编程方式向 Windows 窗体添加菜单的步骤如下:
1. 创建一个新的公共过程,例如
AddMenuAndItems
。
Public Sub AddMenuAndItems()
'代码将放在这里
End Sub
-
在该过程中,声明一个
MainMenu对象的实例。例如,将实例命名为mnuFile。
Dim mnuFile as New MainMenu()
-
将窗体的
Menu属性设置为刚刚创建的MainMenu实例,将mnuFile关联为窗体的菜单。
Me.Menu = mnuFile
-
在过程中,创建
MenuItem对象并将其添加到MainMenu对象的集合中。
Dim mnuItemFile as New MenuItem("&File")
Dim mnuItemNew as New MenuItem("&New ")
mnuFile.MenuItems.Add(mnuItemFile)
mnuItemFile.MenuItems.Add(mnuItemNew)
-
完成菜单结构的编程创建后,需要调用创建的过程。一个合理的调用位置是窗体的
Load事件,这样在窗体加载时就会创建菜单。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddMenuAndItems()
End Sub
除了添加“文件”菜单项,还可以以相同的方式添加其他顶级菜单项,如“编辑”菜单项。也可以通过向
MenuItem
对象的
MenuItems
属性添加
MenuItem
对象来创建子菜单。
为菜单项添加功能
菜单项的目的是在被点击时执行某些操作,因此可以使用菜单项的
Click
事件过程为菜单项提供功能。
Click
事件不仅在用户点击菜单项时发生,当用户使用键盘选择菜单项并按下
ENTER
键,或者按下与菜单项关联的访问键或快捷键时,
Click
事件也会发生。
如果菜单项的
MenuItems
属性包含任何项,则不会引发该事件,即父菜单项不会触发
Click
事件。
以下代码在名为
mnuItemNew
的菜单项被点击时,将“New”输出到调试窗口:
Private Sub mnuItemNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Debug.Write("New")
End Sub
如果在设计时添加菜单项,可以通过从“类名”下拉列表中选择菜单项名称,从“方法名”下拉列表中选择“Click”来添加事件过程。如果是通过编程方式添加菜单项,则需要手动输入事件过程。
如果在设计时添加菜单项,Visual Basic .NET 会在 Windows 窗体设计器生成的代码区域自动添加以下代码,以使菜单项能够处理事件(在这种情况下是
Click
事件):
Friend WithEvents mnuEditCopy As System.Windows.Forms.MenuItem
如果是通过编程方式添加菜单项,则需要添加
MenuItem
的
Click
事件的事件处理程序。可以通过在已编写的
AddMenuAndItems
过程中添加以下代码来实现:
AddHandler mnuItemNew.Click, AddressOf Me.mnuItemNew_Click
增强菜单
可以为菜单添加以下四种增强特性,以向用户传达信息:
-
复选标记
:用于指示某个功能是开启还是关闭。例如,在 Microsoft Word 中,“视图”菜单下的“标尺”菜单项会根据文档窗口边缘是否显示标尺而被选中或取消选中。
-
快捷键
:是在应用程序中访问菜单项的键盘命令。例如,在 Microsoft Word 中,“文件”菜单下的“新建”菜单项可以使用快捷键
CTRL-N
访问。
-
访问键
:允许用户通过按下
ALT
键和加下划线的访问键的组合来导航菜单。例如,在 Microsoft Word 中,“文件”菜单可以通过组合键
ALT-F
访问,“文件”菜单下的“新建”菜单项可以通过组合键
ALT-F-N
访问。
-
分隔条
:用于在菜单中分组相关命令,使菜单更易于阅读。例如,在 Microsoft Word 中,“文件”菜单下,分隔条将“新建”、“打开”和“关闭”菜单项与后续菜单项分隔开。
添加复选标记
可以在设计时和运行时添加复选标记。在设计时,有两种方法可以为菜单项添加复选标记:
- 在菜单设计器中选择菜单项后,在属性窗口中将
Checked
属性设置为
True
。
- 点击菜单项左侧的区域。点击后会出现一个复选标记,表示
Checked
属性已设置为
True
。再次点击该区域可以消除复选标记。
菜单项的
RadioCheck
属性可以自定义所选项目的外观。如果
RadioCheck
属性为
True
,则项目旁边会出现一个单选按钮;如果
RadioCheck
属性为
False
,则项目旁边会出现一个复选标记。
在运行时添加复选标记,只需将菜单项的
Checked
属性设置为
True
:
mnuItemNew.Checked = True
添加快捷键
可以在设计时和运行时添加快捷键。在设计时,通过在菜单设计器中选择菜单项,从属性窗口中选择
Shortcut
属性,并从下拉列表中选择一个值来添加快捷键。
在运行时添加快捷键,只需将菜单项的
Shortcut
属性设置为可用值之一。以下代码将菜单项的快捷键设置为
F6
:
mnuItemNew.Shortcut = System.Windows.Forms.Shortcut.F6
添加访问键
可以在设计时和运行时添加访问键。在设置
Text
属性时,在要加下划线作为访问键的字母前输入一个与号(
&
)即可。
添加分隔条
添加分隔条的方法与添加快捷键、访问键或复选标记不同。可以在设计时或运行时将分隔条作为一个菜单项添加。在属性窗口、菜单设计器或代码中设置
Text
属性时,输入一个连字符(
-
)即可将该菜单项设置为分隔条。也可以在菜单设计器中右键单击要添加分隔条的位置,然后选择“New Separator”。
禁用 Windows 窗体菜单上的项
在某些情况下,菜单项代表的命令可能不可用,此时应该禁用该菜单项。例如,在 Microsoft Word 中,“编辑”菜单下的“剪切”和“复制”菜单项在没有选择文本时会变灰(禁用),因为此时没有内容可供剪切或复制。当选择文本后,这些菜单项会变为可用。
禁用不可用的菜单项有以下优点:
-
用户体验
:避免用户点击不可用的菜单项而没有任何反应,从而避免用户误解应用程序出现问题。
-
错误预防
:剪切文本的代码可能假设存在已选择的文本,如果没有选择文本就执行剪切代码可能会导致错误。通过在没有选择文本时禁用菜单项,可以避免执行可能导致错误的代码。
菜单项在创建时默认是启用的。可以通过将菜单项的
Enabled
属性设置为
False
来禁用它。可以在设计时,当在菜单设计器中选择菜单项时,通过属性窗口来设置,也可以通过编程方式设置:
mnuItemNew.Enabled = False
禁用菜单中的第一个或顶级菜单项(如传统“文件”菜单中的“文件”菜单项)会禁用该菜单中包含的所有菜单项。同样,禁用具有子菜单项的菜单项会禁用其子菜单项。
如果给定菜单上的所有命令对用户都不可用,应该同时隐藏和禁用整个菜单。可以通过将最顶级菜单项的
Visible
属性设置为
False
来隐藏菜单。这样可以避免菜单结构中出现禁用项,从而提供更简洁的用户界面。
需要注意的是,仅隐藏菜单是不够的,还必须禁用菜单,因为仅隐藏菜单并不能防止用户通过快捷键访问菜单命令。
上下文菜单
许多 Windows 应用程序都有快捷菜单,当用户在窗体区域或窗体上的控件上右键单击时会显示这些快捷菜单。快捷菜单也称为上下文菜单,因为显示的特定菜单项取决于上下文,如应用程序状态或右键单击的窗体或控件位置。在 Visual Basic .NET 中,
ContextMenu
类代表快捷菜单。
上下文菜单通常用于组合窗体主菜单中对用户有用的不同菜单项,具体取决于应用程序的上下文。例如,可以将一个快捷菜单分配给
TextBox
控件,以便用户可以立即访问主菜单中也有的菜单项,如剪切、复制和粘贴文本,查找文本,更改文本字体等。此外,上下文菜单还可以包含主菜单中没有的菜单项,以提供特定情况下的命令。
创建上下文菜单
与创建主菜单一样,可以在设计时在 Windows 窗体设计器中添加上下文菜单,也可以在运行时通过编程方式添加。无论哪种方式,创建上下文菜单都需要两个步骤:首先向窗体添加
ContextMenu
对象,然后向其添加
MenuItem
对象。
设计时创建上下文菜单
在设计时创建上下文菜单的步骤如下:
1. 在 Windows 窗体设计器中打开要添加上下文菜单的窗体。
2. 在工具箱中双击
ContextMenu
组件。此时,窗体上会添加一个上下文菜单,显示“Type Here”文本,并且
ContextMenu
组件会添加到组件托盘中。
3. 通过在窗体或控件的
ContextMenu
属性的下拉列表中选择
ContextMenu
对象,将上下文菜单与窗体或控件关联起来。
需要注意的是,多个控件可以使用同一个
ContextMenu
。可以使用
SourceControl
属性来确定最后显示快捷菜单的控件,以便执行特定于该控件的任务或修改为该控件显示的快捷菜单。
运行时创建上下文菜单
在运行时通过编程方式添加上下文菜单的步骤如下:
1. 创建一个新的公共过程,例如
AddContextMenu
。
Public Sub AddContextMenu()
'代码将放在这里
End Sub
-
在该过程中,声明一个
ContextMenu对象的实例。例如,将实例命名为mnuContextMenu。
Dim mnuContextMenu as New ContextMenu()
-
将窗体的
ContextMenu属性设置为刚刚创建的ContextMenu实例:
Me.ContextMenu = mnuContextMenu
向上下文菜单添加项
在向 Windows 窗体添加
ContextMenu
组件后,下一步是向其添加菜单项。可以在设计时、运行时添加菜单项,也可以从主菜单复制菜单项。
设计时添加菜单项
在设计时向上下文菜单添加菜单项与向主菜单添加菜单项基本相同。点击“Type Here”文本,输入所需菜单项的名称来添加菜单项。如果“Type Here”文本未显示,可以通过点击 Windows 窗体上的
ContextMenu
组件来显示它。要添加另一个菜单项,可以点击菜单设计器中的另一个“Type Here”区域。点击当前菜单项下方的区域可以添加另一个菜单项,点击当前菜单项右侧的区域可以添加子菜单项。
上下文菜单与主菜单的一个区别是,上下文菜单通常没有顶级项,如主菜单中的“文件”项。
运行时添加菜单项
在运行时向上下文菜单添加菜单项与向主菜单添加菜单项基本相同。以下是一个在运行时向上下文菜单添加菜单项的示例:
Public Sub AddContextMenu()
Dim mnuContextMenu as New ContextMenu()
Me.ContextMenu = mnuContextMenu
Dim mnuItemNew as New MenuItem()
Dim mnuItemOpen as New MenuItem()
mnuItemNew.Text = "&New"
mnuItemOpen.Text = "&Open"
mnuContextMenu.MenuItems.Add(mnuItemNew)
mnuContextMenu.MenuItems.Add(mnuItemOpen)
End Sub
上下文菜单也可以包含子菜单。可以通过向父
MenuItem
的
MenuItems
集合添加
MenuItem
对象来创建子菜单。
从菜单复制菜单项到上下文菜单
有时可能希望上下文菜单复制主菜单中的命令。例如,在 Microsoft Word 中,“编辑”菜单下的“剪切”、“复制”和“粘贴”菜单命令在点击文档时经常会在快捷菜单中重复出现。
可以在设计时使用菜单设计器复制菜单,也可以在运行时使用
CloneMenu
方法复制菜单。
在设计时复制菜单项的步骤如下:
1. 在菜单设计器中选择
MainMenu
组件,选择要复制的菜单项,右键单击它们,然后选择“复制”。
2. 选择
ContextMenu
组件,选择第一个菜单项要出现的“Type Here”区域,然后右键单击并选择“粘贴”。
在运行时使用
CloneMenu
方法复制菜单项的示例代码如下:
Private mmMainMenu As MainMenu
Private miEditMenu As MenuItem
Private cmEdit As ContextMenu
Private Sub CopyMenuItems()
'创建全局 MainMenu 和顶级 MenuItem 对象的实例
mmMainMenu = New MainMenu
miEditMenu = New MenuItem("&Edit")
'创建三个菜单项作为 MainMenu 菜单结构的一部分
miEditMenu.MenuItems.Add("&Cut")
miEditMenu.MenuItems.Add("&Copy")
miEditMenu.MenuItems.Add("&Paste")
'将顶级菜单项添加到 MainMenu 组件
mmMainMenu.MenuItems.Add(miEditMenu)
'将 MainMenu 组件设置为窗体的菜单
Form1.Menu = mmMainMenu
'创建全局上下文菜单对象的实例
cmEdit = New ContextMenu
'克隆 MainMenu 组件的顶级 MenuItem
'然后将复制的 MenuItem 添加到 ContextMenu 组件
cmEdit.MenuItems.Add(miEditMenu.CloneMenu())
'设置窗体的 ContextMenu 组件
Form1.ContextMenu = cmEdit
End Sub
为上下文菜单项添加功能
为上下文菜单添加功能的方式与为
MainMenu
添加功能的方式相同,即使用菜单项的
Click
事件过程。如果从
MainMenu
复制项到
ContextMenu
,则希望上下文菜单中的菜单项使用主菜单中相应菜单项的事件处理程序。
根据 MSDN 的说法,复制菜单项会保留与原始菜单项建立的属性设置和事件处理程序,因此新创建的菜单项会使用相同的事件处理程序,因为整个
MenuItem
对象被克隆。然而,根据实际实验,这可能仅在通过编程方式复制菜单项时成立,而在设计时使用菜单设计器的复制和粘贴功能时可能不成立。
有三种方法可以让主菜单菜单项的
Click
事件过程也处理相应上下文菜单菜单项的
Click
事件:
1.
使用
AddHandler
:以下代码假设上下文菜单菜单项是
cmnSelectAll
,相应的主菜单菜单项是
mnuEditSelectAll
:
AddHandler cmnSelectAll.Click, AddressOf Me.mnuEditSelectAll_Click
这行代码可以逻辑地放在窗体的加载事件中。
-
扩展主菜单菜单项的
Click事件过程的Handles子句 :主菜单菜单项的Click事件过程已经有Handles mnuEditSelectAll.Click子句。可以将cmnSelectAll.Click添加到Handles子句中,用逗号将其与mnuEditSelectAll.Click分隔开:
Private Sub mnuEditSelectAll_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles mnuEditSelectAll.Click, cmnSelectAll.Click
txtEdit.SelectAll()
End Sub
-
从上下文菜单菜单项的
Click事件过程调用主菜单菜单项的Click事件过程 :
Private Sub cmnSelectAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
mnuEditSelectAll_Click(sender, e)
End Sub
通过以上步骤,你可以在 Visual Basic .NET 中创建功能丰富的菜单和上下文菜单,并为它们添加各种增强特性和功能,从而提升应用程序的用户体验。
Visual Basic .NET 菜单与上下文菜单创建指南(续)
常见问题解答与注意事项
在创建和使用菜单与上下文菜单的过程中,可能会遇到一些常见问题,以下是相关解答和注意事项。
设计时与编程方式的选择
有开发者会问,应该使用菜单设计器创建菜单还是通过编程方式创建呢?一般来说,推荐在可以使用菜单设计器的时候优先使用它,因为它比通过代码创建菜单更快,并且更不容易出错。但当你在 Visual Basic .NET 开发中处理更复杂的应用程序时,可能需要在应用程序运行时动态修改菜单,这时就只能通过编程方式实现了。而且,通过代码创建菜单能让你更深入地了解菜单的工作原理,而菜单设计器会隐藏一些细节。
菜单项复制后的事件处理
在复制菜单项时,虽然 MSDN 提到复制会保留属性设置和事件处理程序,但实际情况可能有所不同。如果是通过编程方式复制菜单项,可能会保留事件处理程序;但如果在设计时使用菜单设计器的复制和粘贴功能,可能就无法保留。所以在处理复制菜单项的事件时,需要根据实际情况选择合适的方法来确保事件处理的正确性。
总结与最佳实践
在 Visual Basic .NET 中创建菜单和上下文菜单是提升应用程序用户交互性的重要手段。以下是一些总结和最佳实践建议。
菜单创建总结
- 设计时创建 :适合快速搭建简单的菜单结构,操作直观,易于上手。在设计时可以方便地设置菜单项的基本属性,如文本、快捷键等。
- 编程方式创建 :适用于需要动态修改菜单的场景,能实现更复杂的菜单逻辑。在编程时,要注意对象的声明和属性的设置,确保菜单结构正确。
功能添加与增强
-
菜单项功能
:使用
Click事件过程为菜单项添加功能,要注意父菜单项不会触发Click事件。在处理复制菜单项的事件时,可根据情况选择合适的方法。 - 菜单增强特性 :合理使用复选标记、快捷键、访问键和分隔条,能提升菜单的易用性和可读性。例如,使用复选标记可以直观地显示功能的开启或关闭状态;快捷键和访问键能提高用户操作效率;分隔条能让菜单结构更清晰。
上下文菜单使用
- 创建与添加项 :上下文菜单的创建和添加菜单项的方法与主菜单类似,但通常没有顶级项。可以根据应用程序的上下文,灵活组合主菜单中的菜单项,并添加特定情况下的命令。
- 功能关联 :为上下文菜单添加功能时,要确保与主菜单菜单项的事件处理程序正确关联,以保证操作的一致性。
流程图总结
下面是创建菜单和上下文菜单的流程图,帮助你更清晰地理解整个过程。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{选择创建方式}:::decision
B -->|设计时| C(打开 Windows 窗体设计器):::process
B -->|运行时| D(创建公共过程):::process
C --> E(添加 MainMenu 或 ContextMenu 组件):::process
D --> F(声明 MainMenu 或 ContextMenu 实例):::process
E --> G(添加 MenuItem 对象):::process
F --> H(设置窗体菜单属性):::process
H --> I(创建 MenuItem 对象并添加):::process
G --> J(为菜单项添加功能):::process
I --> J
J --> K(添加菜单增强特性):::process
K --> L(处理菜单项复制和事件关联):::process
L --> M([结束]):::startend
表格总结
| 操作类型 | 设计时操作 | 运行时操作 |
|---|---|---|
| 创建菜单 |
1. 打开 Windows 窗体设计器
2. 双击
MainMenu
组件
3. 点击“Type Here”添加菜单项 |
1. 创建公共过程
2. 声明
MainMenu
实例
3. 设置窗体
Menu
属性
4. 创建
MenuItem
对象并添加
|
| 创建上下文菜单 |
1. 打开 Windows 窗体设计器
2. 双击
ContextMenu
组件
3. 关联上下文菜单到窗体或控件 |
1. 创建公共过程
2. 声明
ContextMenu
实例
3. 设置窗体
ContextMenu
属性
|
| 添加菜单项 | 点击“Type Here”输入菜单项名称 |
创建
MenuItem
对象,设置
Text
属性并添加到相应菜单集合
|
| 菜单项复制 | 菜单设计器中复制粘贴 |
使用
CloneMenu
方法
|
| 菜单项功能添加 |
从下拉列表选择菜单项和
Click
事件
|
手动输入事件过程,使用
AddHandler
关联事件
|
通过遵循这些最佳实践,你可以在 Visual Basic .NET 中创建出功能完善、用户体验良好的菜单和上下文菜单,为应用程序的用户提供更加便捷和高效的操作方式。希望本文能帮助你在开发过程中更好地运用菜单和上下文菜单,提升应用程序的质量和交互性。
超级会员免费看
2

被折叠的 条评论
为什么被折叠?



