在前面的教程中,我们讲到了窗体的主要属性与事件,而本节我们主要讲述窗体的一些窗口运用。本节知识对于后面“多文档文件”的创建非常重要,所以希望大家好好掌握。
一、添加窗体:
在 VB 中每创建一个新文件,自动会生成一个新窗体,如果想在本窗体的基础上再添加一个窗体,那么应该如何做呢?
1、选择工程/添加窗体命令,弹出如图一的窗口:
图一
2、选择你需要的窗体,然后点按“打开”就行了,结果可以在“工程”窗口中看到,如图二:
图二
二、清除窗体:
在“工程”窗口中选中欲被清除的窗体,然后鼠标右键,在弹出的菜单中选择“移除……”命令。如图三:
图三
三、窗体的显示属性:
多窗口文件,往往是启动时打开主窗口,通过一些命令再打开其他窗口,那么,如何对窗口是否显示进行设置呢?
1、选择“工程/工程属性”菜单命令,在弹出的窗口中找到“启动对象”,然后从中选择文件打开时的主窗口是哪个,如图四:
图四
2、其他窗体的载入:
我们可以在主窗口中设置菜单或按钮,并在该菜单或按钮的代码区输入如下代码:
Form2.Show 1
其中,Show 是显示窗体的一种方法,1 是窗体的显示模式即 Mode ,当值为 0 即非模态窗体时(常态窗口),允许用户在当前程序中切换到其他窗口;当值为 1 即模态窗体时,用户不能在各个窗口间切换。
3、窗体在程序中的三种状态:
未装入:窗体没进入程序,不占用程序资源,可以通过 Unload 方法卸载窗体。装入但不显示:可以用 Load 方法将窗体载入内存,随时准备显示。
显示:用 Show 方法可以显示窗体,如果窗体已装入内存,那么直接 Show ;如果窗体还没装入内存,Show 可以先用 Load 的方法将窗体载入内存,然后再显示出来。
载入窗体:Load FormX
卸载窗体:Unload FormX
显示窗体:FormX.Show Mode
再论窗体
除窗体设计原理以外,还需考虑应用程序的开始与结束。有一些技巧用于决定应用程序启动时的外观。熟悉应用程序卸载时进行的一些处理也很重要。
设置启动窗体
在缺省情况下,应用程序中的第一个窗体被指定为启动窗体。应用程序开始运行时,此窗体就被显示出来(因而最先执行的代码是该窗体的Form_Initialize 事件中的代码)。如果想在应用程序启动时显示别的窗体,那么就得改变启动窗体。
要改变启动窗体,请按照以下步骤执行:
1. 从“工程”菜单中,选取“工程属性”。
2. 选取“一般”。
3. 在“启动对象”ListBox 中,选取要作为新启动窗体的窗体。
4. 选取“确定”。
没有启动窗体时的启动
有时候也许要应用程序启动时不加载任何窗体。例如:可能想先运行装入数据文件的代码,然后再根据数据文件的内容决定显示几个不同窗体中的哪一个。要做到这一点,可在标准模块中创建一个名为 Main 的子过程,如下面的例子所示。
Sub Main()
Dim intStatus As Integer
'调用一个函数过程来检验用户状态。
intStatus = GetUserStatus
'根据状态显示某个启动窗体。
If intStatus = 1 Then
frmMain.Show
Else
frmPassword.Show
End If
这个过程必须是一个子过程,且不能在窗体模块内。欲将 Sub Main 过程设为启动对象,可从“工程”菜单中,选取“工程属性”,再选“一般”,然后从“启动对象”框中选定“Sub Main”。
显示启动时的快速显示
如果启动时有一个较长的执行过程,例如要从数据库中装入大量数据或者要装入一些大型位图,这时可能希望在启动时给出一个快速显示。快速显示是一种窗体,它通常显示的是诸如应用程序名,版权信息和一个简单的位图等内容。启动 Visual Basic 时所显示的屏幕就是一个快速显示。
要显示快速显示,需用 Sub Main 过程作为启动对象,并用 Show 方法显示该窗体:
Private Sub Main()
'显示快速显示。
frmSplash.Show
'在此处添加启动过程。
...
'显示主窗体并卸载快速显示。
frmMain.Show
Unload frmSplash
End Sub
当一些启动例程正在执行时,快速显示能吸引用户的注意,造成应用程序装载很快的错觉。当这些启动例程完成以后,可以装入第一个窗体并使其快速显示卸载。
对于快速显示的设计来说,尽量简单为好。如果使用大量位图或者大量控件,则快速显示本身装入将会变慢。
结束应用程序
当所有窗体都已关闭并且没有代码正在执行时,事件驱动的应用程序就停止运行。如果最后一个可见窗体关闭时仍有隐藏窗体存在,那么,应用程序表现为已经结束了(因为没有可见的窗体),可实际上应用程序仍在继续运行,直至所有隐藏窗体都关闭为止。之所以出现这种情况,是因为对已卸载窗体的属性或控件的任何访问,都将导致隐含地、不予显示地加载那个窗体。
避免出现关闭应用程序时的这类问题,最好的办法是确保所有的窗体都已卸载。如果有一个以上窗体,可以使用 Forms 集合和 Unload 语句。例如,在主窗体上可以用一个名为 cmdQuit 的命令按钮退出程序。如果应用程序只有一个窗体,则 Click 事件过程可简单为:
Private Sub cmdQuit_Click ()
Unload Me
End Sub
如果应用程序使用多窗体,通过把代码放入主窗体的 Unload 事件过程可以卸载这些窗体。可以使用 Forms 集合确保找到并关闭所有窗体。下列代码就是使用窗体集合来卸载所有窗体的:
Private Sub Form_Unload (Cancel As Integer)
Dim i as integer
'在窗体集合中循环并卸载每个窗体。
For i = Forms.Count - 1 to 0 Step - 1
Unload Forms(i)
Next
End Sub
有一些情况需要不顾现存窗体或对象的状态而结束应用程序。为此,VisualBasic 提供了 End 语句。
End 语句使应用程序立即结束:在End语句之后的代码不会执行,也不会再有事件发生。特别是,Visual Basic将不执行任何窗体的QueryUnload、Unload或 Terminate事件过程。对象的各个引用将被释放,但如果定义有自己的类,Visual Basic 将不执行由这些类所创建对象的Terminate事件。
除 End 语句以外,Stop语句可以暂停一个应用程序。然而,Stop 语句只能在调试时使用,因为它不释放对象的引用。
详细信息 关于 Stop 语句的信息,请参阅第十三章“调试代码和处理错误”中的“使用中断模式”,以及《语言参考》的“Stop 语句”。关于窗体集合或者释放对象引用的信息,请参阅第九章“用对象编程”。
在应用程序中使用菜单
许多简单的应用程序只由一个窗体和几个控件组成,但是通过增加菜单可以增强 Visual Basic 应用程序的功能。这一节将介绍如何在应用程序中创建菜单和使用菜单。
用菜单编辑器创建菜单
用菜单编辑器可以创建新的菜单和菜单栏、在已有的菜单上增加新命令、用自己的命令来替换已有的菜单命令以及修改和删除已有的菜单和菜单栏。
要显示菜单编辑器,请:
从“工具”菜单上,选取“菜单编辑器”。
- 或者 -
在“工具栏”上单击“菜单编辑器”按钮。这就会打开菜单编辑器,如图 6.7 所示。
尽管大多数菜单控件属性可用菜单编辑器设置,所有的菜单属性在“属性”窗口中也都是可用的。菜单控件的两个最重要的属性是:
Name——这是代码中用来引用菜单控件的名字。
Caption——这是出现在控件上的文本。
菜单编辑器中的其它属性,包括 Index、Checked 和 NegotiatePosition,在本章稍后介绍。
使用菜单编辑器中的列表框
菜单控件列表框(位于菜单编辑器的下部)列出当前窗体的所有菜单控件。当在标题文本框中键入一个菜单项时,该项也会出现在菜单控件列表框中。从列表框中选取一个已存在的菜单控件可以编辑该控件的属性。
例如,图 6.7 表明典型应用程序中“文件”菜单的各种菜单控件。菜单控件在菜单控件列表框中的位置决定了该控件是菜单标题、菜单项、子菜单标题还是子菜单项:
位于列表框中左侧平齐的菜单控件作为菜单标题显示在菜单栏中。
列表框中被缩进过的菜单控件,当单击其前导的菜单标题时才会在该菜单上显示。
一个缩进过的菜单控件,如果后面还紧跟着再次缩进的一些菜单控件,它就成为一个子菜单的标题。在子菜单标题以下缩进的各个菜单控件,就成为该子菜单的菜单项。
一个以连字符 (-) 作为它的 Caption 属性的菜单控件,作为一个分隔符条出现。分隔符条可把菜单项划分成若干个逻辑组。 注意 如果菜单控件是一个菜单标题、带有子菜单项、被复选或无效、或者有一个快捷键,那么它就不能作为分隔符条。
要在菜单编辑器中创建菜单控件,请按照以下步骤执行:
1. 选取该窗体
2. 从“工具”菜单中,选取“菜单编辑器”。- 或者 -在“工具栏”上单击“菜单编辑器”按钮。
3. 在“标题”文本框中,为第一个菜单标题键入希望在菜单栏上显示的文本。如果希望某一字符成为该菜单项的访问键,也可以在该字符前面加上一个 (&) 字符。在菜单中,这一字符会自动加上一条下划线。
菜单标题文本显示在菜单控件列表框中。
4. 在“名称”文本框中,键入将用来在代码中引用该菜单控件的名字。请参阅本章后面“菜单标题与命名准则”。
5. 单击向左或向右箭头按钮,可以改变该控件的缩进级。
6. 如果需要的话,还可以设置控件的其他属性。这一工作可以在菜单编辑器中做,也可以以后在“属性”窗口中做。
7. 选取“下一个”就可以再建一个菜单控件。- 或者 -单击“插入”可以在现有的控件之间增加一个菜单控件。也可以单击向上与向下的箭头按钮,在现有菜单控件之中移动控件。
8. 如果窗体所有的菜单控件都已创建,选取“确定”可关闭菜单编辑器。创建的菜单标题将显示在窗体上。在设计时,单击一个菜单标题可下拉其相应的菜单项。
分隔菜单项
分隔符条作为菜单项间的一个水平行显示在菜单上。在菜单项很多的菜单上,可以使用分隔符条将各项划分成一些逻辑组。例如Visual Basic的“帮助”菜单,使用分隔符条将其菜单项分成三组,如图 6.8 所示。
要在菜单编辑器中创建分隔符条,请按照以下步骤执行:
1. 如果想在一现有菜单中增加一个分隔符条,选取“插入”,在想要分隔开来的菜单项之间插入一个菜单控件。
2. 如有必要,单击右箭头按钮使新菜单项缩进到与它要隔开的菜单项同级。
3. 在“标题”文本框中键入一个连字符 (-)。
4. 设置“名称”属性。
5. 选取“确定”,关闭菜单编辑器。
注意 虽然分隔符条是当作菜单控件来创建的,它们却不能响应 Click 事件,而且也不能被选取。
赋值访问键和快捷键
通过定义访问键和快捷键可改进键盘对菜单命令的访问。
访问键
访问键允许按下ALT键并打入一个指定字符来打开一个菜单。一旦菜单打开,通过按下所赋值的字符(访问键)可选取控件。例如,按下 ALT + E 键可打开“编辑”菜单,再按P键可选取“粘贴”菜单项。在菜单控件的标题中,一个指定的访问键表现为一个带下划线的字母,如图 6.9 所示。
要在菜单编辑器中给菜单控件赋值访问键,请按照以下步骤执行:
1. 选取要赋值访问键的菜单项。
2. 在其“标题”框中,在要作为访问键字符的前面直接键入一个 (&) 字符。
例如,如果图6.9所示的“编辑”菜单被打开,下列Caption属性设置值响应的对应键。
注意 菜单中不能使用重复的访问键。如果多个菜单项使用同一个访问键,则该键将不起作用。例如,如果C同时是“剪切”和“复制”的访问键,那么,当选取“编辑”菜单且键入C时,则“复制”命令将被选,但只有按下ENTER键以后,应用程序才会执行该命令。而“剪切”命令根本不会执行。
快捷键
快捷键按下时会立刻运行一个菜单项。可以为频繁使用的菜单项指定一个快捷键,它提供一种键盘单步的访问方法,而不是按住ALT键、再按菜单标题访问字符,然后再按菜单项访问字符的三步方法。快捷键的赋值包括功能键与控制键的组合,如CTRL + F1键或CTRL + A键。它们出现在菜单中相应菜单项的右边,如图6.10所示。
要对菜单项赋值快捷键,请按照以下步骤执行:
1. 打开“菜单编辑器”。
2. 选取该菜单项。
3. 在“快捷键”组合框中选取功能键或者键的组合。
要删除快捷键赋值,应选取列表顶部的“(none)”。
注意 快捷键将自动出现在菜单上;因此,不需要在菜单编辑器的“标题”框中键入 CTRL+key。
菜单标题与命名准则
为了与其它应用程序保持一致,创建菜单时遵循所确立的命名准则是一个好办法。
设置 Caption 属性
为菜单项进行标题赋值时,应当尽量遵循下列准则:
1.菜单中项目名称应当唯一,但不同菜单中相似动作项目可以重名。
2.项目名称可以是单词、复合词或者多个词。
3.每一个项目名称都应当有一个用键盘选取命令的、一个唯一的记忆访问字符。访问字符应当是菜单标题的第一个字母,除非别的字符更易记;两个菜单标题不能用同一个访问字符。关于指定访问键与快捷键的详细信息,请参阅本章前面的“用菜单编辑器创建菜单”部分。
4.如果命令在完成之前还需要附加信息,则在其名称后面应当有一个省略号(…),比如显示一个对话框的命令(“另存为…”,“首选项…”) 。
5.项目名称尽量简短。如果要使应用程序本地化,那么,在外文版中字词长度会增加将近百分之三十,这样也许没有足够空间列出各个菜单项。有关应用程序本地化的更详细内容,请参阅第十六章“国际发行”。
菜单命名约定
为了使代码更可读和更易维护,在菜单编辑器中设置 Name 属性时遵循已确定的命名约定是一个好办法。大多数命名约定规则都建议用前缀来标识对象(即,对菜单控件用 mnu),其后紧跟顶层菜单的名称(如 File)。对于子菜单,其后再紧跟该子菜单的标题(如 mnuFileOpen)。
详细信息 有关所建议的命名约定的示例,请参阅附录 B“Visual Basic 编码约定”。有关所建议的命名约定的示例,请参阅“Visual Basic 编码约定”。
创建子菜单
所创建的每个菜单可以包含最多五级子菜单。子菜单会分支出另一个菜单以显示它自己的菜单项。需使用子菜单的场合有:
菜单栏已满。
某一特定菜单控件很少被用到。
要突出某一菜单控件与另一个的关系。
然而,如果菜单栏中还有空间,最好再创建一个菜单标题而不是子菜单。这样,当菜单拉下时所有控件都可见。限制使用子菜单也是一种好的编程策略,它可以免去查找应用程序菜单界面的负担(大多数应用程序都只使用一级子菜单)。
在菜单编辑器中,在不是菜单标题的菜单控件之下缩进的任何菜单控件,都是子菜单控件。一般来说,子菜单控件可以包括子菜单项、分隔符条和子菜单标题。
要创建子菜单,请按照以下步骤执行:
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) 对象库中列出。
当平铺或者层叠有着固定边框类型的子窗体时,每个子窗体都像具有可变尺寸边框那样被定位。这使得子窗体可能重叠。
联系客服