再论窗体
除窗体设计原理以外,还需考虑应用程序的开始与结束。有一些技巧用于决定应用程序启动时的外观。熟悉应用程序卸载时进行的一些处理也很重要。
设置启动窗体
在缺省情况下,应用程序中的第一个窗体被指定为启动窗体。应用程序开始运行时,此窗体就被显示出来(因而最先执行的代码是该窗体的Form_Initialize事件中的代码)。如果想在应用程序启动时显示别的窗体,那么就得改变启动窗体。
要改变启动窗体,请按照以下步骤执行:
1.从“工程”菜单中,选取“工程属性”。
2.选取“一般”。
3.在“启动对象”ListBox中,选取要作为新启动窗体的窗体。
4.选取“确定”。
没有启动窗体时的启动
有时候也许要应用程序启动时不加载任何窗体。例如:可能想先运行装入数据文件的代码,然后再根据数据文件的内容决定显示几个不同窗体中的哪一个。要做到这一点,可在标准模块中创建一个名为Main的子过程,如下面的例子所示。
SubMain()
DimintStatusAsInteger
调用一个函数过程来检验用户状态。
intStatus=GetUserStatus
根据状态显示某个启动窗体。
IfintStatus=1Then
frmMain.Show
Else
frmPassword.Show
EndIf
这个过程必须是一个子过程,且不能在窗体模块内。欲将SubMain过程设为启动对象,可从“工程”菜单中,选取“工程属性”,再选“一般”,然后从“启动对象”框中选定“SubMain”。
显示启动时的快速显示
如果启动时有一个较长的执行过程,例如要从数据库中装入大量数据或者要装入一些大型位图,这时可能希望在启动时给出一个快速显示。快速显示是一种窗体,它通常显示的是诸如应用程序名,版权信息和一个简单的位图等内容。启动VisualBasic时所显示的屏幕就是一个快速显示。
要显示快速显示,需用SubMain过程作为启动对象,并用Show方法显示该窗体:
PrivateSubMain()
显示快速显示。
frmSplash.Show
在此处添加启动过程。
…
显示主窗体并卸载快速显示。
frmMain.Show
UnloadfrmSplash
EndSub
当一些启动例程正在执行时,快速显示能吸引用户的注意,造成应用程序装载很快的错觉。当这些启动例程完成以后,可以装入第一个窗体并使其快速显示卸载。
对于快速显示的设计来说,尽量简单为好。如果使用大量位图或者大量控件,则快速显示本身装入将会变慢。
结束应用程序
当所有窗体都已关闭并且没有代码正在执行时,事件驱动的应用程序就停止运行。如果最后一个可见窗体关闭时仍有隐藏窗体存在,那么,应用程序表现为已经结束了(因为没有可见的窗体),可实际上应用程序仍在继续运行,直至所有隐藏窗体都关闭为止。之所以出现这种情况,是因为对已卸载窗体的属性或控件的任何访问,都将导致隐含地、不予显示地加载那个窗体。
避免出现关闭应用程序时的这类问题,最好的办法是确保所有的窗体都已卸载。如果有一个以上窗体,可以使用Forms集合和Unload语句。例如,在主窗体上可以用一个名为cmdQuit的命令按钮退出程序。如果应用程序只有一个窗体,则Click事件过程可简单为:
PrivateSubcmdQuit_Click()
UnloadMe
EndSub
如果应用程序使用多窗体,通过把代码放入主窗体的Unload事件过程可以卸载这些窗体。可以使用Forms集合确保找到并关闭所有窗体。下列代码就是使用窗体集合来卸载所有窗体的:
PrivateSubForm_Unload(CancelAsInteger)
Dimiasinteger
在窗体集合中循环并卸载每个窗体。
Fori=Forms.Count-1to0Step-1
UnloadForms(i)
Next
EndSub
有一些情况需要不顾现存窗体或对象的状态而结束应用程序。为此,VisualBasic提供了End语句。
End语句使应用程序立即结束:在End语句之后的代码不会执行,也不会再有事件发生。特别是,VisualBasic将不执行任何窗体的QueryUnload、Unload或Terminate事件过程。对象的各个引用将被释放,但如果定义有自己的类,VisualBasic将不执行由这些类所创建对象的Terminate事件。
除End语句以外,Stop语句可以暂停一个应用程序。然而,Stop语句只能在调试时使用,因为它不释放对象的引用。
详细信息关于Stop语句的信息,请参阅第十三章“调试代码和处理错误”中的“使用中断模式”,以及《语言参考》的“Stop语句”。关于窗体集合或者释放对象引用的信息,请参阅第九章“用对象编程”。
在应用程序中使用菜单
许多简单的应用程序只由一个窗体和几个控件组成,但是通过增加菜单可以增强VisualBasic应用程序的功能。这一节将介绍如何在应用程序中创建菜单和使用菜单。
用菜单编辑器创建菜单
用菜单编辑器可以创建新的菜单和菜单栏、在已有的菜单上增加新命令、用自己的命令来替换已有的菜单命令以及修改和删除已有的菜单和菜单栏。
要显示菜单编辑器,请:
从“工具”菜单上,选取“菜单编辑器”。
-或者-
在“工具栏”上单击“菜单编辑器”按钮。这就会打开菜单编辑器,如图6.7所示。
尽管大多数菜单控件属性可用菜单编辑器设置,所有的菜单属性在“属性”窗口中也都是可用的。菜单控件的两个最重要的属性是:
Name——这是代码中用来引用菜单控件的名字。
Caption——这是出现在控件上的文本。
菜单编辑器中的其它属性,包括Index、Checked和NegotiatePosition,在本章稍后介绍。
使用菜单编辑器中的列表框
菜单控件列表框(位于菜单编辑器的下部)列出当前窗体的所有菜单控件。当在标题文本框中键入一个菜单项时,该项也会出现在菜单控件列表框中。从列表框中选取一个已存在的菜单控件可以编辑该控件的属性。
例如,图6.7表明典型应用程序中“文件”菜单的各种菜单控件。菜单控件在菜单控件列表框中的位置决定了该控件是菜单标题、菜单项、子菜单标题还是子菜单项:
位于列表框中左侧平齐的菜单控件作为菜单标题显示在菜单栏中。
列表框中被缩进过的菜单控件,当单击其前导的菜单标题时才会在该菜单上显示。
一个缩进过的菜单控件,如果后面还紧跟着再次缩进的一些菜单控件,它就成为一个子菜单的标题。在子菜单标题以下缩进的各个菜单控件,就成为该子菜单的菜单项。
一个以连字符(-)作为它的Caption属性的菜单控件,作为一个分隔符条出现。分隔符条可把菜单项划分成若干个逻辑组。 注意如果菜单控件是一个菜单标题、带有子菜单项、被复选或无效、或者有一个快捷键,那么它就不能作为分隔符条。
要在菜单编辑器中创建菜单控件,请按照以下步骤执行:
1.选取该窗体
2.从“工具”菜单中,选取“菜单编辑器”。-或者-在“工具栏”上单击“菜单编辑器”按钮。
3.在“标题”文本框中,为第一个菜单标题键入希望在菜单栏上显示的文本。如果希望某一字符成为该菜单项的访问键,也可以在该字符前面加上一个(&)字符。在菜单中,这一字符会自动加上一条下划线。
菜单标题文本显示在菜单控件列表框中。
4.在“名称”文本框中,键入将用来在代码中引用该菜单控件的名字。请参阅本章后面“菜单标题与命名准则”。
5.单击向左或向右箭头按钮,可以改变该控件的缩进级。
6.如果需要的话,还可以设置控件的其他属性。这一工作可以在菜单编辑器中做,也可以以后在“属性”窗口中做。
7.选取“下一个”就可以再建一个菜单控件。-或者-单击“插入”可以在现有的控件之间增加一个菜单控件。也可以单击向上与向下的箭头按钮,在现有菜单控件之中移动控件。
8.如果窗体所有的菜单控件都已创建,选取“确定”可关闭菜单编辑器。创建的菜单标题将显示在窗体上。在设计时,单击一个菜单标题可下拉其相应的菜单项。
分隔菜单项
分隔符条作为菜单项间的一个水平行显示在菜单上。在菜单项很多的菜单上,可以使用分隔符条将各项划分成一些逻辑组。例如VisualBasic的“帮助”菜单,使用分隔符条将其菜单项分成三组,如图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“VisualBasic编码约定”。有关所建议的命名约定的示例,请参阅“VisualBasic编码约定”。
->