VB- 工具栏、对话框

来源:百度文库 编辑:神马文学网 时间:2024/04/20 03:36:59
工具栏
可以用工具栏进一步增强应用程序的菜单界面。工具栏含有工具栏按钮,它提供了对于应用程序中最常用的命令的快速访问。例如:Visual Basic 的工具栏含有执行常用命令的 ToolBarButton,如“打开”(打开已存在的工程)、“保存”(存储当前的工程),等等。
创建工具栏
工具栏(也称为发条或者控制栏)已经成为许多基于 Windows 的应用程序的标准功能。工具栏提供了对于应用程序中最常用的菜单命令的快速访问。使用 ToolBar 控件来创建工具栏非常容易且很方便,它在 Visual Basic的专业版与企业版中是可用的。如果使用的是 Visual Basic 学习版,则可以像本章后面的“协调菜单与工具栏的外观”所描述的那样用手工来创建工具栏。
下列示例演示为 MDI 应用程序创建工具栏的过程;在标准窗体上创建一个工具栏的过程基本上一样。
要手工创建工具栏,请按照以下步骤执行:
1. 在 MDI 窗体上放置一个图片框。图片框的宽度会自动伸展,直到填满 MDI 窗体工作空间。工作空间就是窗体边框以内的区     域,不包括标题条、菜单栏或所有的工具栏、状态栏或者可能在窗体上的滚动条。
注意 只能把那些直接支持 Align 属性的控件放置在 MDI 窗体上(图片框是支持这一属性的唯一的标准控件)。
2. 在图片框中,可以放置任何想在工具栏上显示的控件。典型地,用 CommandButton 或 Image 控件来创建工具栏按钮。图      6.16表示出了一个含有 Image 控件的工具栏。
要在图片框中添加控件,单击工具栏中的控件按钮,然后在图片框中画出它。
注意 当 MDI 窗体中包含了图片框时,该 MDI 窗体的内部区域不包括图片框在内。例如:MDI 窗体的 ScaleHeigh 属性返回         MDI 窗体的内部高度,这个高度已不包括图片框的高度。
3. 设置设计时属性。
使用工具栏的一个好处是可以显示一个形象的命令图示。Image 控件是作为工具栏按钮的一个很好的选择,因为可以用它来显示一个位图。在设计时设置其 Picture 属性来显示一个位图;这样,当该按钮被单击时,即能提供一个命令执行的可见信息。也可以通过设置按钮的 ToolTipText属性来使用工具提示,这样,当用户把鼠标指针保持在一个按钮上时,就可以显示出该工具栏按钮的名称。
4. 编写代码
因为工具栏频繁地用于提供对其它命令的快捷访问,因而在大部分时间内都是从每一个按钮的 Click 事件中调用其它过程,比如对应的菜单命令。
提示 可用一个不显示工具栏的 MDI 窗体来使用在运行时不可见的控件(比如 Timer 控件)。为了做到这一点,在 MDI 窗体上放置一个图片框,把控件放到图片框中,然后把图片框的 Visible 属性设置为 False。
编写工具栏的代码
工具栏用于提供访问某些应用程序命令的快捷方法。例如:图 6.16 中工具栏上的第一个按钮就是“新建文件”命令的快捷键。现在,可以在 MDINotePad 示例应用程序中三个地方请求创建新文件。
1.在 MDI 窗体上(MDI 窗体上“文件”菜单中的“新建”命令)。
2.在子窗体上(在子窗体“文件”菜单上的“新建”命令)。
3.在工具栏上(“新建文件”按钮)。
与其把这个代码重复三次,还不如从子窗体的 mnuFileNew_Click 事件取出原代码,然后把它放入子窗体的一个公用过程中。可以从上面任何一个事件过程调用这个过程。以下是一个示例:
'这个例程在公共过程中。
Public Sub FileNew ()
Dim frmNewPad As New frmNotePad
frmNewPad.Show
End Sub
'在子窗体的“文件”菜单上选取“新建”。
Private Sub mnuchildFileNew_Click ()
FileNew
End Sub
'在 MDI 窗体的“文件”菜单上选取“新建”。
Private Sub mnumdiFileNew_Click ()
frmNotePad.FileNew
End Sub
'在工具栏上单击“新建文件”按钮。
Private Sub btnFileNew_Click ()
frmNotePad.FileNew
End Sub
协调菜单与工具栏的外观
当由其它应用程序提供的对象在窗体中被激活时,有许多方法让对象的菜单与工具栏出现在容器窗体内;然而,需要规定它们将如何显示。这一过程叫做用户界面协调,因为 Visual Basic 与已经链接或嵌入的对象必须协调容器窗体中的空间。
控制菜单的外观
通过设置窗体的 NegotiateMenus 属性可以决定一个链接或嵌入的对象的菜单是否出现在容器窗体中。如果子窗体的 NegotiateMenus 属性置为 True(缺省),而且容器有一个定义的菜单栏,那么,当这个对象被激活时,它的菜单就放置在容器的菜单栏中。如果容器没有菜单栏,或者NegotiateMenus 属性被设置为 False,那么,当这个对象激活时对象的菜单将不出现。
注意 NegotiateMenus 属性不适用于 MDI 窗体。
控制工具栏的外观
MDI 窗体的 NegotiateToolbars 属性决定了链接或嵌入对象的工具栏是不固定的调色板还是被放置在父窗体上。这种性能不要求工具栏出现在 MDI 父窗体上。如果 MDI 窗体的 NegotiateToolbars 属性设为 True,则对象的工具栏出现在 MDI 父窗体上。如果 NegotiateToolbars 设为 False,则对象的工具栏就为不固定的调色板。
注意 NegotiateToolbars 属性只用于 MDI 窗体。
如果 MDI 窗体包含工具栏,它通常被包含在父窗体的 PictureBox 控件中。图片框的 Negotiate 属性决定了被激活时容器的工具栏是继续显示还是被对象的工具栏所代替。如果 Negotiate 设置为 True,则除了容器的工具栏外还显示对象的工具栏。如果 Negotiate 设置为 False,则对象的工具栏代替容器的工具栏。
注意 菜单与工具栏的协调只发生在支持现场激活的可插入对象之上。有关现场激活的详细信息,请参阅第十章“用部件编程”。用以下过程可以看到这三个属性如何交互作用。
要执行菜单与工具栏的协调,请按照以下步骤执行:
1. 在 MDI 窗体中添加工具栏。这在本章前面的“创建工具栏”中描述过。
2. 在子窗体上放置一个可插入的对象。
3. 设置 NegotiateMenus、NegotiateToolbars 以及 Negotiate 属性。
4. 运行此应用程序,然后双击该对象。
对话框
在基于 Windows 的应用程序中,对话框被用来:
提示用户提供应用程序继续执行所需要的数据。
向用户显示信息。
例如,在 Visual Basic 中,用“打开文件”对话框来显示已存在的工程。VisualBasic 中的“关于”对话框也是一个如何使用对话框来显示信息的例子。在菜单栏上单击“帮助”,选择“关于 Visual Basic”菜单项,则显示“关于”对话框。
模式与无模式的对话框
对话框不是模式就是无模式的。模式对话框,在可以继续操作应用程序的其他部分之前,必须被关闭(隐藏或卸载)。例如,如果一个对话框,在可以切换到其它窗体或对话框之前要求先单击“确定”或“取消”,则它就是模式的。
Visual Basic 中的“关于”对话框是模式的。显示重要消息的对话框总应当是模式的——那就是说,在继续做下去之前,总是要求用户应当先关上对话框或者对它的消息作出响应。
无模式的对话框允许在对话框与其他窗体之间转移焦点而不用关闭对话框。当对话框正在显示时,可以在当前应用程序的其他地方继续工作。无模式对话框很少使用。Visual Basic 中“编辑”菜单中的“查找”对话框就是一个无模式对话框的实例。无模式对话框用于显示频繁使用的命令与信息。
要将窗体作为模式对话框显示,请
1.使用 Show 方法,其 style 参数值为 vbModal(一个值为 1 的常数)。例如:
'将 frmAbout 作为模式对话框显示。
frmAbout.Show vbModal
要将窗体作为无模式对话框显示,请
2.使用不带 style 参数的 Show方法。
例如:
'将 frmAbout 作为无模式对话框显示。
frmAbout.Show
注意 如果窗体显示为模式对话框,则只有当对话框关闭之后,在 Show 方法后的代码才能执行。然而,当窗体被显示为无模式对话框时,在该窗体显示出来以后,Show 方法后面的代码紧接着就会执行。
Show 方法另有一个可选参数,owner,可用来指定窗体的父子关系。可将某个窗体名传给这个参数,使得这个窗体成为新窗体的拥有者。要显示一个窗体,作为另一个窗体的子窗体,请
这里 Show 方法有两个参数:style 和 owner。
例如:
' 将 frmAbout 显示为 frmMain 的无模式子窗体。
frmAbout.Show vbModeless, frmMain
在 Show 方法中使用 owner 参数,确保对话框在它的父窗体最小化时它也最小化,或者在其父窗体关闭时它也卸载。
预定义对话框的使用
在应用程序中添加对话框最容易的方法是使用预定义对话框,因为不必考虑设计、装载或者显示对话框方面的问题。然而,控件在其外观上要受到限制。预定义的对话框总是模式的。
下表列出了 Visual Basic 应用程序中添加预定义对话框时能使用的函数。
用输入框来提示输入
应用 InputBox 函数请求提供数据。这个函数显示要求输入数据的模式对话框。图 6.17 所示的文本输入框提示输入要打开文件的名称。
以下代码显示图 6.17 中所示的输入框。
FileName = InputBox("Enter file to open:", "File Open")
注意 切记当使用 InputBox 函数时,对对话框的各部分的控制非常有限。只能改变标题栏中的文本、显示给用户的命令提示、对话框在屏幕上的位置以及它是否显示一个“帮助”按钮。
详细信息 请参阅《语言参考》的“InputBox 函数”。
用消息对话框显示信息
可以用 MsgBox 函数获得“是”或者“否”的响应,并显示简短的消息,比如:错误、警告或者对话框中的期待。看完这些消息以后,可选取一个按钮来关闭该对话框。
如果文件不能打开,那么名为 Text Editor 的应用程序就会显示如图 6.18 所示的消息对话框。
以下代码显示如图 6.18 所示的消息框:
MsgBox "Error encountered while trying to open file, _
please retry.", vbExclamation, "Text Editor"
注意 所谓模式的,既可以局限于应用程序中,也可以局限于系统中。如果消息框的模式局限在应用程序中(缺省),则在这个对话框未消失之前不能切换到该应用程序的其他部分,但是可以切换到其他应用程序。在消息框未消失之前系统的模式消息框不允许切换到别的应用程序。
详细信息 请参阅《语言参考》的“MsgBox 函数”。
用窗体作为自定义对话框
自定义对话框就是用户所创建的含有控件的窗体——这些控件包括命令按钮、选取按钮和文本框——它们可以为应用程序接收信息。通过设置属性值来自定义窗体的外观。也可以编写在运行时显示对话框的代码。
要创建自定义对话框,可以从新窗体着手,或者自定义现成的对话框。如果重复过多,可以建造能在许多应用程序中使用的对话框的集合。
要自定义现存的对话框,请按照以下步骤执行:
1. 从“工程”菜单中选取“添加窗体”,在工程中添加一现存的窗体。
2. 从“文件”菜单中选取“filename 另存为”并输入新的文件名(这可以防止改变已存在的窗体版本)。
3. 根据需要自定义窗体的外观。
4. 在代码窗口中自定义事件过程。
要创建新的对话框,请按照以下步骤执行:
1. 从“工程”菜单中选取“添加窗体”。
- 或者 -
在工具栏上单击“窗体”按钮,创建新的窗体。
2. 如有必要,自定义窗体外观。
3. 在“代码”窗口中自定义事件过程。
有很大的自由来定义自定义对话框的外观。它可以是固定的或可移动的、模式或无模式的。它可以包含不同类型的控件;然而,对话框通常不包括菜单栏、窗口滚动条、最小化与最大化按钮、状态条或者尺寸可变的边框。本主题余下的部分将讨论创建典型类型的对话框方法。
添加标题
对话框总应当有标识它的标题。要创建标题,设置该窗体的 Caption 属性为将在标题条中显示的文本字符串。通常,这一步是在设计时使用“属性”窗口来完成的,但也可以用代码来完成这一步。例如:
frmAbout.Caption = "About"
提示 如果想完全删除此标题栏,可以设置窗体的 ControlBox、MinButton 和MaxButton 为 False;设置 BorderStyle 为尺寸不可变的设置(0、1 或 3),并设置 Caption 为空字符串 ("")。
设置标准对话框的属性
一般来说,用户响应对话框时,先提供信息,然后用“确定”或者“取消”命令按钮关闭对话框。因为对话框是临时性的,用户通常不需要对它进行移动、改变尺寸、最大化或最小化等操作。其结果是:随新窗体出现的可变尺寸边框类型、“控制”菜单框、“最大化”按钮以及“最小化”按钮,在大多数对话框中都是不需要的。
通过设置 BorderStyle、ControlBox、MaxButton 和 MinButton 属性,可以删除这些项目。例如,“关于”对话框可能使用以下的属性设置。
记住,如果删除“控制”菜单框 ( ControlBox = False ),则必须向用户提供退出该对话框的其它方法。实现的办法通常是在对话框中添加“确定”、“取消”或者“退出”命令按钮,并在隐藏或卸载该对话框的 Click 按钮事件中添加代码。
添加和放置命令按钮
模式对话框必须至少包含一个退出该对话框的命令按钮。通常用两个命令按钮:其中一个按钮开始动作,而另一个按钮关闭该对话框而不做任何改变。典型状态是,这两个按钮的 Caption 属性设置“确定”与“取消”。在这个方案中,“确定”命令按钮的 Default 属性设置为 True,而 Cancel 命令按钮的 Cancel 属性设置为 True。虽然“确定”与“取消”是最常用的按钮,其他的按钮标题组合也可使用。
显示消息的对话框通常使用 Label 控件来显示错误消息或者命令提示,并且用一至两个命令按钮来执行动作。例如,也许给标识的 Caption 属性赋以错误消息或者命令提示,而给两个命令按钮控件的 Caption 属性指定“是”与“否”。当用户选取“是”,则发生一个动作,当选取“否”时,则发生另一个动作。
这种类型对话框的命令按钮通常被放置在对话框的底部或右边,而顶部或左边的按钮为缺省按钮,如图 6.19 所示。
设置缺省、取消和焦点
命令按钮控件提供了以下的属性:
Default
Cancel
TabIndex
TabStopDefault
按钮就是当用户按下 ENTER 键时选中的按钮。在一个窗体上,只能有一个命令按钮的 Default 属性可以设置为 True。按下 ENTER 键就调用缺省命令按钮的 Click 事件。这个功能连同编辑控件(比如 TextBox )一起工作。例如,可以在文本框中键入数据,然后按下 ENTER 键来产生Click 事件,以取代选取“确定”按钮。
“取消”按钮就是当按下 ESC 键时选中的按钮。在一个窗体上,只能有一个命令按钮的 Cancel 属性可以设置为 True。按下 ESC 键调用“取消”命令按钮的 Click 事件。“取消”按钮也可以为缺省命令按钮。要指定对话框的“取消”按钮,设置该命令按钮的 Cancel 属性为 True。
提示 一般说来,代表最可靠的或者最安全的操作的按钮应当是缺省按钮。例如,在“文本替换”对话框中,“取消”应当是缺省按钮,而不是“全部替换”。
也可以指定当对话被显示时具有焦点的按钮。当窗体被显示时,带有最低的 TabIndex 设置的控件接收焦点。按下 ENTER 键会调用缺省命令按钮或者有焦点的命令按钮的 Click 事件。要在窗体被显示时将焦点给某个命令按钮,则设置该命令按钮的 TabIndex 为 0,它的 TabStop 属性为 True。也可以用 SetFocus 方法在窗体被显示时将焦点给指定的控件。
详细信息 请参阅《语言参考》的“TabIndex 属性”与“TabStop 属性”。
使对话框上的控件无效
有时候需要使控件无效,因为它们的动作在当前的上下文中不适用。例如,当 Visual Basic 的“查找”对话框第一次显示时,“查找下一个”按钮应无效,如图 6.20 所示。设置对话上的控件的 Enabled 属性为 False,可以使其无效。
要使对话框上的控件无效,请
1.设置每个控件的 Enabled 属性为 False。例如:
cmdFindNext.Enabled = False
cmdReplace.Enabled = False
显示自定义对话框
使用应用程序中显示其他窗体同样的方法来显示对话框。当应用程序运行时,启动窗体会自动装入。想在应用程序中出现第二个窗体或对话框,要用装入并显示它的代码来实现。同样,想要窗体或对话框消失,也要编写卸载或隐藏它的代码。
以下代码在用户选取“帮助”菜单中的“关于”菜单项时显示“关于”对话框。
Private Sub mnuHelpAbout_Click ()
'此处用 style = vbModal 的 Show 方法将对话框显示为模式的。
frmAbout.Show vbModal
End Sub
显示选项
代码决定对话框将如何装入内存与如何显示。下表描述各种类型的显示任务以及用来执行这些任务的关键字。
Show 方法装入窗体并设置它的 Visible 属性为 True。传递给 Show 方法的参数标识了该对话框的类型。如果 style 参数省略或者设置为 vbModeless或 0(缺省),则对话框为无模式类型,如果 style 参数为 vbModal 或 1,则对话框为模式类型。
当选取“确定”或“取消”退出对话框时,可使用 Unload 语句或者 Hide 方法。例如:
Unload frmAbout
- 或者 -
frmAbout.Hide
Unload 语句把对话框从内存中删除,而 Hide 方法只是通过设置对话框的Visible 属性为 False 将其从视窗中删除。当卸载窗体时,该窗体本身以及它的控件都从内存中卸载(包括在运行时装入的任何控件)。当隐藏窗体时,该窗体以及它的控件仍留在内存中。    当需要节省内存空间时,最好卸载窗体,因为卸载窗体可以释放内存。如果经常使用对话框,可以选取隐藏窗体。隐藏窗体仍可以保留与它关联的任何数据,包括属性值、打印输出和动态创建的控件。窗体被隐藏后,可以继续从代码中引用隐藏窗体的属性与控件。
各种显示类型的设计
Microsoft Windows 是与设备无关的-基于窗口的应用程序可以在许多不同显示分辨率与颜色浓度的计算机中运行。同样,用 Visual Basic 编写的应用程序也会在不同类型的显示器上运行,在设计应用程序时需要考虑到这一点。
设计与分辨率无关的窗体
缺省情况下,当改变屏幕分辨率时,Microsoft Visual Basic 不会改变窗体与控件的尺寸。这就意味着在分辨率为 1024×768 的屏幕上设计的窗体,在分辨率为 640×480 的屏幕中运行时会伸出屏幕的边界之外。如果想创建不管使用什么样的屏幕分辨率都能有相同比例的窗体和控件,必须在最低的分辨率下设计窗体,或者将改变窗体的代码添加到程序中去。
避免尺寸问题的最简单的方法是在 640×480 的分辨率下设计窗体。如果更喜欢在高一些的分辨率下工作,仍需要考虑窗体在低一些的分辨率下将如何显示。实现这一点的方法是用“Form Layout”窗口预览窗体的大小和位置。您也可以使用“Resolution Guides”观察在低分辨率时屏幕的哪些部分是可见的。要切换到“Resolution Guides”,可以在“Form Layout”窗口单击鼠标右键,从弹出菜单上选择“Resolution Guides”菜单项。
在运行时,Visual Basic 根据设计时的位置来放置窗体。如果设计时在 1024×768 的分辨率上运行,并把窗体放到屏幕的右下角,则当它在比较低的分辨率下运行时该窗体可能看不见。为了避免这种情况的发生,在设计时可从“Form Layout”窗口的弹出菜单选择“Startup Position”菜单项来设置窗体的启动位置。同样,您也可以在运行时用下面的 Form Load 事件中的代码来设置窗体的位置:
Private Sub Form_Load()
Me.Move 0, 0
End Sub
尽管设置窗体的 Left 与 Top 的属性都为 0 也能有同样的效果,但 Move方法只要一步就能完成。
Visual Basic 使用与设备无关的度量单位,缇,是用来计算尺寸与位置的单位。Screen 对象的两个属性 TwipsPerPixelX 与 TwipsPerPixelY 可以用来确定运行时的显示尺寸。应用这些属性,可以编写代码来调整窗体以及控件的尺寸与位置。
Private Sub SetControls()
Dim X As Integer
Dim Y As Integer
X = Screen.TwipsPerPixelX
Y = Screen.TwipsPerPixelY
Select Case X, Y
Case 15, 15
' 重新改变控件尺寸及移动控件。
txtName.Height = 200
txtName.Width = 500
txtName.Move 200, 200
' 增加为其它分辨率编写的代码。

End Sub
也需要知道在设计时 Visual Basic 自身窗口的位置。如果在高分辨率下把“工程”窗口放置到屏幕的右边,那么会发现在低分辨率下打开工程时,它不再是可访问的了。
设计不同浓度的颜色
在设计应用程序时,也需要考虑运行应用程序计算机可能的颜色显示能力。有些计算机可以显示 256 色或更多的颜色,而另一些只能显示 16 种颜色。如果使用 256 色的调色板来设计窗体,那么在 16 色上显示时,抖动(模仿无效颜色的一种方法)会使窗体上的一些元素消失。
为了避免这种情况,最好把应用程序使用的颜色局限于 Windows 标准的 16种颜色。这些颜色由 Visual Basic 的颜色常数来表示(如 vbBlack、vbBlue 和vbCyan 等等)。如果在应用程序中需要用 16 种以上的颜色,那么对于文本、按钮以及其他界面元素仍然应当坚持用标准颜色。
设计时心里想着用户
除非创建 Visual Basic 应用程序完全只供自己使用,否则创作的价值只能由其他人来评价。应用程序的用户界面对用户有极大的影响——无论代码在技术上多么卓越,或者优化得多么的好,如果用户发现应用程序很难使用,那么他们就难于很好地接受它。
作为程序员,毫无疑问,对计算机方面技术已非常熟悉。因而很容易忘记大多数用户不理解(而且也许并不在意)隐藏在应用程序后面的技术。把应用程序看作达到目的工具:完成任务的方法想象中应比没有计算机的帮助更容易。
一个设计得好的用户界面把用户与基础技术隔离开来,从而使完成预定的任务变得很容易。在设计应用程序用户界面的过程中,需要时时想到用户。如何能无需指导就发现应用程序的各种各样的功能?当错误发生时,应用程序如何响应?在帮助或辅助用户方面将提供些什么?设计是否以一种艺术美来使用户高兴?以上这些问题的答案以及其他有关用户为中心的设计问题,在本节中都将涉及到。
界面设计的基础
不必成为创建用户界面的艺术家——大多数用户界面设计的原则,与任意一门基础艺术课中所讲授的基础设计的原则相同。构图、颜色等的基本的设计原则,就像它们应用在纸张或油画上一样,也能很好地在一台计算机的屏幕上应用。
虽然 Visual Basic 能通过简单地将控件拖动并放置到窗体上而使得创建用户界面非常容易,但是,在设计之前稍微计划一下就能使应用程序的可用性有很大地改观。可能需先在纸上画出窗体开始设计,决定需要哪些控件,不同元素的相对重要性,以及控件之间的关系。
构图:应用程序的观感与感觉
窗体的构图或布局不仅影响它的美感,而且也极大地影响应用程序的可用性。构图包括诸如控件的位置、元素的一致性、动感、空白空间的使用以及设计的简单性等因素。
控件的位置
在大多数界面设计中,不是所有的元素都一样重要。仔细地设计是很有必要的,以确保越是重要的元素越要很快地显现给用户。重要的或者频繁访问的元素应当放在显著的位置上,而不太重要的元素就应当降级到不太显著的位置上。
在大多数语言中我们习惯于在一页之中从左到右、自上到下地阅读。对于计算机屏幕也如此,大多数用户的眼睛会首先注视屏幕的左上部位,所以最重要的元素应当放在屏幕的左上部位。例如,如果窗体上的信息与客户有关,则它的名字字段应当显示在它能最先被看到的地方。而按钮,如“确定”或“下一个”,应当放置在屏幕的右下部位;用户在未完成对窗体的操作之前,通常不会访问这些按钮。
把元素与控件分成组也很重要。尽量把信息按功能或关系进行逻辑地分组。因为他们的功能彼此相关,所以定位数据库的按钮应当被形象地分成一组,而不是分散在窗体的四处。对信息也是一样,名字字段与地址通常分在一组,因为它们联系紧密。在许多情况下,可以使用框架控件来帮助加强控件之间的联系。
界面元素的一致性
在用户界面设计中,一致性是一种优点。一致的外观与感觉可以在应用程序中创造一种和谐,任何东西看上去都那么协调。如果界面缺乏一致性,则很可能引起混淆,并使应用程序看起来非常混乱、没有条理、价值降低,甚至可能引起对应用程序可靠性的怀疑。
为了保持视觉上的一致性,在开始开发应用程序之前应先创建设计策略和类型约定。诸如控件的类型、控件的尺寸、分组的标准以及字体的选取等设计元素都应该在事先确定。可以创建设计样板来帮助进行设计。
在 Visual Basic 中有大量的控件可供使用,这可能引起有人想使用所有的控件。为了避免这种引诱,选取能很好地适合特定应用程序的控件子集。虽然列表框、组合框、网格以及树等控件都可用来表示信息列表,最好还是尽可能使用一种类型。
还有,尽量恰当地使用控件,虽然 TextBox 控件可以设置成只读并用来显示文本,但 Label 控件通常更适用于该目的。在为控件设置属性时请保持一致性,如果在一个地方为可编辑的文本使用白色背景,除非有很好的理由,否则不要在别的地方又使用灰色。
在应用程序中不同的窗体之间保持一致性对其可用性有非常重要的作用。如果在一个窗体上使用了灰色背景以及三维效果,而在另一个窗体上使用白色背景,则这两个窗体就显得毫不相干。选定一种类型并在整个应用程序保持一致,即使这意味着要重新设计某些功能。
动感:窗体与其功能匹配
动感是对象功能的可见线索。虽然对这个术语也许还不熟悉,但动感的实例四处可见。自行车上的把手,手放在它的上面,动感会将把手用手扣紧这件事显现出来。按下按钮、旋转旋钮和点亮电灯的开关等都能进行动感表示,一看到它们就可以看出其用处。
用户界面也使用动感。例如,用在命令按钮上的三维立体效果使得他们看上去像是被按下去的。如果设计平面边框的命令按钮的话,就会失去这种动感,因而不能清楚地告诉用户它是一个命令按钮。在有些情况下,平面的按钮也许是适合的,比如游戏或者多媒体应用程序;只要在整个应用程序中保持一致就很好。
文本框也提供了一种动感,用户可以期望带有边框和白色背景的框,框中包含可编辑的文本。显示不带边框的文本框 (BorderStyle = 0) 也有可能,这使它看起来像一个标签,并且不能明显地提示用户它是可编辑的。
空白空间的使用
在用户界面中使用空白空间有助于突出元素和改善可用性。空白空间不必非得是白色的——它被认为是窗体控件之间以及控件四周的空白区域。一个窗体上有太多的控件会导致界面杂乱无章,使得寻找一个字段或者控件非常困难。在设计中需要插入空白空间来突出设计元素。
各控件之间一致的间隔以及垂直与水平方向元素的对齐也可以使设计更可用。就像杂志中的文本那样,安排得行列整齐、行距一致,整齐的界面也会使其容易阅读。
Visual Basic 提供了几个工具,使得控件的间距、排列和尺寸的调整非常容易。“排列”、“按相同大小制作”、“水平间距”、“垂直间距”和“在窗体中央”等命令都可以在“格式”菜单中找到。
保持界面的简明
界面设计最重要的原则也许就是简单化。对于应用程序而言,如果界面看上去很难,则可能程序本身也很难。稍稍深入考虑一下便有助于创建看上去(实际上也是)用起来都很简单的界面。从美学的角度来讲,整洁、简单明了的设计常常更可取。
在界面设计中,一个普遍易犯的错误就是力图用界面来模仿真实世界的对象。例如,想象一下要求创建完整的保险单的应用程序。很自然的反应就是在屏幕上设计完全仿照保险单的界面。这样做会出现几个问题:保险单的形状与尺寸和屏幕上的有很大不同,要非常完善地复制这样的表格会将其限制在文本框与复选框中,而对用户并没有真正的好处。
最好是设计出自己的、也能提供原始保险单打印副本(带打印预览)的界面。通过从原始保险单中创建字段的逻辑组,并使用有标签的界面或几个链接的窗体,就可以不要求滚动屏幕而显示所有的信息。也可以使用附加的控件,比如带有选取预装入的列表框,这些控件可以减少打字工作量。
也可以取出不常用的函数并把它们移到它们自己的窗体中去,来简化许多应用程序。提供缺省有时也可以简化应用程序;如果十个用户中有九个选取加粗的文本,就把文本粗体设为缺省值,而不要叫用户每次都选取一遍(不要忘记提供一个选项可以覆盖该缺省值)。向导也有助于简化复杂的或不常用的任务。
简化与否最好的检验就是在应用中观察应用程序。如果有代表性的用户没有联机帮助就不能立即完成想要完成的任务,那么就需要重新考虑设计了。
使用颜色与图像
在界面上使用颜色可以增加视觉上的感染力,但是滥用的现象也时有发生。许多显示器能够显示几百万种颜色,这很容易使人要全部使用它们。如果在开始设计时没有仔细地考虑,颜色也会像其他基本设计原则一样,出现许多问题。
每个人对颜色的喜爱有很大的不同,用户的品味也会各不相同。颜色能够引发强烈的情感,如果正在设计针对全球读者的程序,那么某些颜色可能有文化上的重大意义。一般说来,最好保守传统,采用一些柔和的、更中性化的颜色。
当然,预期的读者以及试图传达的语气与情绪也会影响对颜色的选取。明亮的红色、绿色和黄色适用于小孩子使用的应用程序,但是在银行应用程序中它很难带来财务责任心。
少量明亮色彩可以有效地突出或者吸引人们对重要区域的注意。作为经验之谈,应当尽量限制应用程序所用颜色的种类,而且色调也应该保持一致。如果可能的话,最好坚持标准的 16 色的调色板;在 16 色显示器上观看时,抖动会使得其他一些颜色显示不出来。    使用颜色时另一个需要考虑的问题就是色盲。有一些人不能分辨不同的基色(如红色与绿色)组合之间的差别。对于有这种情况的人,绿色背景上的红色文本就会看不见。
图像和图标
图片与图标的使用也可以增加应用程序的视觉上的趣味,但是,细心的设计也是必不可少的。不用文本,图像就可以形象地传达信息,但常常不同的人对图像的理解也不一样。
带有表示各种功能的图标的工具栏,它是一种很有用的界面设备,但如果不能很容易地识别图标所表示的功能,反而会事与愿违。在设计工具栏图标时,应查看一下其它的应用程序以了解已经创建了什么样的标准。例如,许多应用程序用一张角上有卷边的纸来表示“新建文件”图标。也许还有更好的比喻来表示这一功能,但改用其它的表示方法会引起用户的混淆。
考虑图像文化上的意义也非常重要。许多程序使用田园风格的带一面旗的邮箱(图 6.21)来代表邮件功能。这原本是美国的图标;其他国家/地区或文化的用户也许不把它看作邮箱。
在设计自己的图标与图像时,应尽量使它们简单。具有多种颜色的复杂的图片,作为16×16像素的工具栏图标,或者在高分辨率的屏幕上显示时,都不能很好地适应。
选取字体
字体也是用户界面的重要部分,因为它们常常给用户传递重要的信息。需选取在不同的分辨率和不同类型的显示器上都能容易阅读的字体。最好尽量坚持使用简单的无衬线字体或者衬线字体。通常手写字体或者其他装饰性字体的打印效果比屏幕上的效果更好,而且字体越小读起来越难。
除非计划按应用程序来配置字体,否则应当坚持使用标准 Windows 字体,如 Arial、New Times Roman 或者 System。如果用户的系统没有包含指定的字体,系统会使用替代的字体,其结果可能与设想的完全不一样。如果正在为国际读者设计,需要调查在预想的语言里可用什么字体。还有,在为其他语言设计时,需要考虑文本的扩展——有些语言的文本串可以多占50% 以上的空间。
还有,在选取字体时,设计的一致性非常重要。大多数情况下,不应当在应用程序中使用两种以上字体。太多的字体会使得应用程序看上去像罚款通知单。