vb菜单在应用程序中的使用(二)

创建子菜单
所创建的每个菜单可以包含最多五级子菜单。子菜单会分支出另一个菜单以显示它自己的菜单项。需使用子菜单的场合有:
菜单栏已满。
某一特定菜单控件很少被用到。
要突出某一菜单控件与另一个的关系。
然而,如果菜单栏中还有空间,最好再创建一个菜单标题而不是子菜单。这样,当菜单拉下时所有控件都可见。限制使用子菜单也是一种好的编程策略,它可以免去查找应用程序菜单界面的负担(大多数应用程序都只使用一级子菜单)。
在菜单编辑器中,在不是菜单标题的菜单控件之下缩进的任何菜单控件,都是子菜单控件。一般来说,子菜单控件可以包括子菜单项、分隔符条和子菜单标题。
要创建子菜单,请按照以下步骤执行:
1. 创建想作为子菜单标题的菜单项。
2. 创建将出现在新子菜单中的各个项目,然后单击右箭头按钮将它们缩进。
在菜单编辑器中每一缩进级前都加了四个点 (....)。要删除一缩进级,单击左箭头按钮。
注意 如果想用多于一级的子菜单,可以考虑使用对话框来替代。对话框允许在一个地方指定好几个选择。关于使用对话框的内容,请参阅本章后面的“对话框”。

创建菜单控件数组
菜单控件数组就是在同一菜单上共享相同名称和事件过程的菜单项目的集合。菜单控件数组使用于:
在运行时要创建一个新菜单项,它必须是控件数组中的成员。如 MDINotepad 示例,它就用一个菜单控件数组来存储新近打开的文件清单。
简化代码,因为通用代码块可以被所有菜单项使用。
每个菜单控件数组元素都由唯一的索引值来标识,该值在菜单编辑器上“Index 属性框”中指定。当一个控件数组成员识别一个事件时,Visual Basic将其 Index 属性值作为一个附加的参数传递给事件过程。事件过程必须包含有核对 Index 属性值的代码,因而可以判断出正在使用的是哪一个控件。
详细信息 关于控件数组的详细信息,请参阅第七章“使用 Visual Basic 的标准控件”中的“使用控件数组”。要在菜单编辑器中创建菜单控件数组,请按照以下步骤执行:
1. 选取窗体。
2. 从“工具”菜单中,选取“菜单编辑器”。
- 或 -
在“工具栏”上单击“菜单编辑器”按钮。
3. 在“标题”文本框中,键入想出现在菜单栏中的第一个菜单标题的文本。菜单标题文本显示在菜单控件列表框中。
4. 在“名称”文本框中,键入将在代码中用来引用菜单控件的名称。保持“索引”框是空的。
5. 在下一个缩进级,通过设定“标题”和“名称”来创建将成为数组中第一个元素的菜单项。
6. 将数组中第一个元素的“索引”设置为 0。
7. 在第一个的同一缩进级上创建第二个菜单项。
8. 将第二个元素的“名称”设置成与第一个元素相同,且把它的“索引”设置为 1。
9. 对于数组中的后续元素重复步骤 5- 8。
重点 菜单控件数组的各元素在菜单控件列表框中必须是连续的,而且必须在同一缩进级上。创建菜单控件数组时,要把在菜单中出现的分隔符条也包括进去。

运行时创建和修改菜单
设计时创建的菜单也能动态地响应运行时的条件。例如,如果菜单项的动作在某些点上成为不适当时,通过使其失效可防止对该菜单项的选取。比如:在 MDI NotePad 应用程序中,如果剪贴板上没有任何文本,则“编辑”菜单中的“粘贴”菜单项变暗,因而就不能被选。
如果有一个菜单控件数组,也可以动态地增加菜单项。这将在本主题后面的“运行时添加菜单控件”中讲述。
也可以编写应用程序,使用复选标志来指示几个命令中的哪一个是最后选取的。例如:如果工具栏被显示,MDI NotePad 应用程序工具栏的“选项”菜单项就会显示一个复选标志。本节描述的其它菜单控件功能包括使菜单项可见或不可见以及增加或删除菜单项操作的代码。

使菜单命令有效或无效
所有的菜单控件都具有 Enabled 属性,当这个属性设为 False 时,菜单命令无效使它不响应动作。当 Enabled 设为 False 时,快捷键的访问也无效。一个无效的菜单控件会变暗,如图 6.11 所示的“粘贴”菜单项。

例如:下列语句使 MDI NotePad 应用程序中“编辑”菜单上的“粘贴”菜单项无效。
mnuEditPaste.Enabled = False
菜单标题的无效使得整个菜单无效,因为不首先单击菜单标题,就不能访问任何菜单项。例如:下列代码将使 MDI NotePad 应用程序的“编辑”菜单无效。
mnuEdit.Enabled = False

显示菜单控件上的复选标志
使用 Checked 属性,可以把一个复选标志放置在菜单上,以便:
表示打开/关闭条件的状态。选取菜单命令可交替地增加和删除此复选标志。
指示几个模式中哪一个正在起作用。MDI NotePad 应用程序的“选项”菜单使用复选标志来指示工具栏的状态,如图 6.12 所示。
在 Visual Basic 中可以用 Checked 属性来创建复选标志。通过选取被标记为 Checked 的复选框来设置菜单编辑器中的 Checked 属性的初始值。在运行时要从一个菜单控件上增加或删除复选标志,可以从代码中设置它的Checked 属性。例如:
Private Sub mnuOptions_Click ()
'根据 Visible 属性设置复选标志的状态。
mnuOptionsToolbar.Checked = picToolbar.Visible
End Sub

使菜单控件不可见
在菜单编辑器中,通过选取被标记为 Visible 的复选框,可以设置菜单控件的 Visible 属性的初值。在运行时,要使一个菜单控件可见或不可见,可以从代码中设置其 Visible 属性。例如:
mnuFileArray(0).Visible = True ' 使控件可见。
mnuFileArray(0).Visible = False ' 使控件不可见。
当一个菜单控件不可见时,菜单中的其余控件会上移以填补空出的空间。如果控件位于菜单栏上,则菜单栏上其余的控件会左移以填补该空间。
注意 使菜单控件不可见也产生使之无效的作用,因为该控件通过菜单、访问键或者快捷键都再无法访问。如果菜单标题不可见,则该菜单上所有控件均无效。

运行时添加菜单控件
运行时菜单可以增长。例如:在图 6.13 中 作为 SDI NotePad 应用程序中被打开的文件,会动态地创建菜单项来显示刚打开文件的路径名。

运行时为了创建控件必须使用控件数组。因为设计时对mnuRecentFile菜单控件的 Index 属性进行了赋值,它自动地成为控件数组的一个元素——即使还没有创建其它元素。
当创建 mnuRecentFile(0) 时,实际上创建了一个在运行时不可见的分隔符条。当运行时用户第一次存储一个文件时,这个分隔符条就会变得可见,且第一个文件名被加到该菜单上。运行时每存储一个文件,则会再装入一个菜单控件到该数组中,从而使该菜单增长。
运行时所创建的控件可以使用 Hide 方法或者设置该控件的 Visible 属性为False 来隐藏。如果要从内存中删除一个控件数组中的控件,请使用 Unload语句。

编写菜单控件的代码
当用户选取一个菜单控件时,一个 Click 事件出现。需要在代码中为每个菜单控件编写一个 Click 事件过程。除分隔符条以外的所有菜单控件(以及无效的或不可见的菜单控件)都能识别 Click 事件。
在菜单事件过程中编写的代码与在控件任何其它事件过程中编写的代码完全相同。例如:“文件”菜单中的“关闭”菜单项的 Click 事件的代码看上去如下:
Sub mnuFileClose_Click()
Unload Me
End Sub
一旦菜单标题被选取,Visual Basic 将自动地显示出一个菜单;但是,没有必要为一个菜单标题的 Click 事件过程编写代码,除非想执行其它操作,比如每次显示菜单时使某些菜单项无效。
注意 在设计时,当关闭菜单编辑器时,所创建的菜单将显示在窗体上。在窗体上选取一个菜单项将显示那个菜单控件的 Click 事件过程。

显示弹出式菜单
弹出式菜单是独立于菜单栏而显示在窗体上的浮动菜单。在弹出式菜单上显示的项目取决于按下鼠标右键时指针所处的位置;因而,弹出式菜单也被称为上下文菜单。
在 Microsoft Windows 95 中,可以通过单击鼠标右键来激活上下文菜单。在运行时,至少含有一个菜单项的任何菜单都可以作为弹出式菜单被显示。为了显示弹出式菜单,可使用 PopupMenu 方法。这个方法使用下列语法:
[object.]PopupMenu menuname [, flags [,x [, y [, boldcommand ]]]]
例如:当用户用鼠标右键单击一个窗体时,以下的代码显示一个名为 mnuFile的菜单。可用 MouseUp 或者 MouseDown 事件来检测何时单击了鼠标右键,虽然标准用法是使用 MouseUp 事件:
Private Sub Form_MouseUp (Button As Integer, Shift As _
Integer, X As Single, Y As Single)
If Button = 2 Then ' 检查是否单击了鼠标右键。
PopupMenu mnuFile ' 把文件菜单显示为一个弹出式菜单。
End If
End Sub
直到菜单中被选取一项或者取消这个菜单时,调用 PopupMenu 方法后面的代码才会运行。
注意 每次只能显示一个弹出式菜单。在已显示一个弹出式菜单的情况下,对后面的调用 PopupMenu 方法将不予理睬。在一个菜单控件正活动的任何时刻,调用 PopupMenu 方法均不会被理睬。
常常会想用一个弹出式菜单来访问那些在菜单栏中不常用的选项。为创建一个不显示在菜单栏里的菜单,可在设计时使顶级菜单项目为不可见(保证在菜单编辑器里的“Visible”复选框没有被选上)。当 Visual Basic 显示一个弹出式菜单时,指定的顶级菜单的 Visible 属性会被忽略。

Flags 参数
在PopupMenu 方法中使用 flags 参数可以进一步定义弹出式菜单的位置与性能。下表列出了可用于描述弹出式菜单位置的标志。

想要指定一个标志,从每组中选取一个常数,再用 Or 操作符将它们连起来。下面的代码是,当用户单击一个命令按钮时,显示一个上边框在窗体中心的弹出式菜单。弹出式菜单触发受到鼠标右键或左键单击的菜单项的Click 事件。
Private Sub Command1_Click ()
' X 变量和 Y 变量的尺寸。
Dim xloc, yloc
'设置 X 变量和 Y 变量到窗体中心。
xloc = ScaleWidth / 2
yloc = ScaleHeight / 2

'显示弹出式菜单。
PopupMenu mnuEdit, vbPopupMenuCenterAlign Or _
vbPopupMenuRightButton, xloc, yloc
End Sub

Boldcommand 参数
使用 boldcommand 参数来指定在显示的弹出式菜单中想以粗体字体出现的菜单控件的名称。在弹出式菜单中只能有一个菜单控件被加粗。

MDI 应用程序中的菜单
在 MDI 应用程序中,每一个子窗体的菜单都显示在 MDI 窗s体上,而不是在子窗体本身。当子窗体有焦点时,该子窗体的菜单(如果有的话)就代替菜单栏上的 MDI 窗体的菜单。如果没有可见的子窗体,或者如果带有焦点的子窗体没有菜单,则显示 MDI 窗体的菜单(见图 6.14 和 6.15)。MDI 应用程序使用几套菜单的情况很普遍。当打开一个文档时,应用程序显示与该类文档相关的菜单。通常,当没有可见子窗体时,会显示一个不同的菜单。例如,当没有文件打开时,Microsoft Excel 只显示“文件”与“帮助”菜单。当用户打开一个文件时,其他菜单就会显示出来(“文件”、“编辑”、“视图”、“插入”、“格式”、“工具”、“数据”和“窗口”等等)。

创建 MDI 应用程序的菜单
通过给 MDI 窗体和子窗体添加菜单控件,可以为 Visual Basic 应用程序创建菜单。管理 MDI 应用程序中菜单的一个方法是把希望在任何时候都显示的菜单控件放在 MDI 窗体上(即使没有子窗体可见时)。当运行该应用程序时,如果没有可见的子窗体,会自动显示 MDI 窗体菜单,如图 6.14所示。
把应用于子窗体的菜单控件放置到子窗体中。在运行时,只要有一个子窗体可见,这些菜单标题就会显示在 MDI 窗体的菜单栏中。
有些应用程序支持多种类型的文档。例如,在 Microsoft Access 中,可以打开表格、查询、窗体和其它文档类型。要在 Visual Basic 中创建这样的应用程序,应使用两个子窗体。设计一个带有执行工作单任务菜单的子窗体和另一个带有完成图表任务菜单的子窗体。

在运行时,当工作单窗体的实例有焦点时,则显示工作单菜单,而当选取图表时,则显示图表窗体的菜单。如果所有的工作单和图表都关闭,则显示 MDI 窗体的菜单。关于创建菜单的详细内容,请参阅本章前面的“在应用程序中使用菜单”部分。

创建“窗口”菜单
大多数 MDI 应用程序(例如:Microsoft Word for Windows 与 MicrosoftExcel)都结合了“窗口”菜单。这是一个显示所有打开的子窗体标题的特殊菜单,如图 6.15 所示。另外,有些应用程序将操纵子窗体的命令,比如“层叠”、“平铺”与“排列图标”,放在这个菜单中。
在 MDI 窗体或者 MDI 子窗体上的任何菜单控件,只要将其 WindowList属性设置为 True,都可以用于显示打开子窗体的清单。在运行时,VisualBasic 自动管理与显示标题清单,并在当前正有焦点的标题旁边显示一个复选标志。另外,在窗口清单的上方自动放置一个分隔符条。
要设置 WindowList 属性,请按照以下步骤执行:
1. 选取希望菜单出现其上的窗体,从“工具”菜单中,选取“菜单编辑器”。
注意 WindowList 属性只应用于 MDI 窗体和 MDI 子窗体。它对标准窗体(非 MDI)不起作用。
2. 在菜单编辑器列表框中,选取希望打开的子窗体的清单显示在其上的菜单。
3. 选取“WindowList”复选框。
在运行时,这个菜单显示打开的子窗体的清单。另外,这个菜单控件的WindowList 属性返回 True。
详细信息 请参阅《语言参考》的“WindowList 属性”。

排列子窗体
就像前面所提到的,有些应用程序把诸如平铺 (Tile)、层叠 (Cascade) 与排列图标 (Arrange Icons) 等操作列在和打开的子窗体列表的同一个菜单上。在 MDI 窗体中使用 Arrange 方法来重新对齐子窗体。可以层叠、水平平铺或者沿着 MDI 窗体的下部排列的子窗体图标等方式来显示子窗体。下面的实例示出了“层叠”、“平铺”和“排列图标”菜单控件的 Click 事件过程。
Private Sub mnuWCascade_Click ()
'层叠子窗体。
frmMDI.Arrange vbCascade
End Sub

Private Sub mnuWTile_Click ()
'平铺子窗体。
frmMDI.Arrange vbTileHorizontal
End Sub

Private Sub mnuWArrange_Click ()
'排列所有子窗体图标。
frmMDI.Arrange vbArrangeIcons
End Sub
注意 内部常数 vbCascade、vbTileHorizontal 和 vbArrangeIcons 都在对象浏览器的 Visual Basic (VB) 对象库中列出。
当平铺或者层叠有着固定边框类型的子窗体时,每个子窗体都像具有可变尺寸边框那样被定位。这使得子窗体可能重叠。

时间: 2024-09-17 03:44:38

vb菜单在应用程序中的使用(二)的相关文章

vb菜单在应用程序中的使用(一)

再论窗体 除窗体设计原理以外,还需考虑应用程序的开始与结束.有一些技巧用于决定应用程序启动时的外观.熟悉应用程序卸载时进行的一些处理也很重要. 设置启动窗体在缺省情况下,应用程序中的第一个窗体被指定为启动窗体.应用程序开始运行时,此窗体就被显示出来(因而最先执行的代码是该窗体的Form_Initialize 事件中的代码).如果想在应用程序启动时显示别的窗体,那么就得改变启动窗体.要改变启动窗体,请按照以下步骤执行:1. 从"工程"菜单中,选取"工程属性".2. 选

在DevExpress程序中使用条形码二维码控件,以及进行报表打印处理

在很多业务系统里面,越来越多涉及到条形码.二维码的应用了,不管在Web界面还是WInform界面都需要处理很多物料相关的操作,甚至很多企业为了减少录入错误操作,为每个设备进行条形码.二维码的标签,直接在流程中进行扫描处理,仅仅在界面勾选一些处理选项即可,极大提高工作效率,降低出错的几率.本篇随笔介绍如何在基于WInform的DevExpress程序中对条形码.二维码的处理,包括界面展示,报表打印等常规的处理. 1.DevExpress的条形码操作及报表打印 在15.1以上的DevEpxress版

MFC应用程序中的菜单提示信息

我正在做一个历时很久的项目.出于某些原因,项目启动之初我们实现了自己的弹出式菜单.当工具提示信息出现之后,我们将这个功能引入了我们自己的菜单,以便当用户将鼠标停留在某个菜单项上的时候,能够出现相应的提示信息.这一功能对于我们的用户来说非常重要,因为 用它可以解释为什么某个菜单项是被禁用的.由于我们的用户对 Windows 平台越来越熟悉,他们想要外观上更标准的菜单.现在我们使用了 CMenu,但是我们失去了 出色的菜单提示信息.请问如何在 MFC 中实现菜单提示信息呢? Joakim Fager

C# winfrom程序如何获取vb程序中shell 传递出来的参数

问题描述 C#winfrom程序如何获取vb程序中shell传递出来的数vb6.0中调用传参如下DimRetValRetVal=Shell("D:Debug3GLogin.exe"&sDeviceId,1)我在c#主窗体load方法中怎么能获取到这个shell传递过来的sDeviceId的值 解决方案 解决方案二:Main(string[]args),入口函数中的args就是命令行参数的数组,还可以通过下标访问解决方案三:进程间通信,通过main的args参数传递...解决方案

VB程序中删除数据的时候报错,可是查看表又发现确实已经删了?

问题描述 VB程序中删除数据的时候报错,可是查看表又发现确实已经删了? 错误信息是: 无法为更新定为行.一些值可能已在最后一次读取后已更改.

VB的32位程序在64位系统中出现文件和注册表自动转向的解决方法_vb

通常用VB 写的程序在32位系统上可以正常的运行,但到了64位系统中虽然可以运行但是无法修改OEM信息.经过查找原因可以发现,当我们在访问文件夹"SYSTEM32"的时候系统会自动转向到文件夹"SYSWOW64"下,当我们在访问某些注册表键值的时候,和文件转向类似,系统也会自动地把程序的访问转向到Wow6432Node下面. 先来谈谈文件系统的转向,查找了一些资料,并没有VB相关的资料,但是可以查到2个相关函数:Wow64DisableWow64FsRedirect

在VFP、VB应用程序中激活鼠标功能

鼠标是WINDOWS环境下不可缺少的输入工具,在应用程序中灵活地使用鼠标功能,会给工作带来极大的 方便.VISUAL FOXPRO6.0和VISUAL BASIC6.0是MICROSOFT VISUAL STUDIO98面向对象的可视化开发环境, 它功能非常强大,而且设计程序简单实用.它提供了与鼠标操作有关的事件和API函数,所以编写鼠标功能 程序就变得非常简单,只需在程序中调用这些事件和API函数即可. 一.与鼠标有关的事件和WINDOWS API函数: 1.MOUSEDOWN 按下鼠标事件.

vb.net程序中如何实现用户名,密码访问局域网文件夹影射

问题描述 我最近写了个客户端自动更新安装的程序现在有个问题,希望大家帮助我在客户的环境中,服务器的某个文件夹做成影射成比如Z:最新文件就放着这个Z盘下可是每次用户重起机器之后必须手动连接一下这个Z盘我想问,有没有什么办法可以在程序中,用用户名和密码来连接这个Z盘? 解决方案 解决方案二:up解决方案三:各位高手同仁,帮帮忙吧解决方案四:将服务器的某个文件夹配置成虚拟目录

使用VB编写纯ASP程序

程序 前几天大哥对我说,使用asp真麻烦,编译环境实在是差劲,他总是在vb里面写好调试好代码然后在把代码粘贴到asp程序中,为此,我在这提出一个解决之道.使用VB接替ASP所有的对象,在VB中编写纯粹的ASP程序. 大家应该都知道,其实asp中的好多组件都是使用VB编写出来的,但是让大家感到很不方便的是如何使用asp固有的几个组件,例如Response,Request,Application,Session等等,如果我要是能够在VB里面直接使用这些组件的话,那么就能够直接使用VB编写asp运用程