【文档说明】Visual-Basic程序设计-菜单与对话框设计.ppt,共(114)页,1.578 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-2464.html
以下为本文档部分文字说明:
菜单与对话框设计菜单设计11.1对话框设计11.211.1菜单设计11.1.1菜单概述菜单对于我们来说并不陌生,要打开文件、保存文件、执行程序等都离不开菜单。一个实际应用程序的功能往往比较复杂,在设计中需要按功能划分成一系列单功能模块,
分别设计界面和代码。综合地运行这些模块就能实现应用程序的完整功能,但分散的操作却给运行添加了麻烦,菜单是解决这一问题的最有效的方法。如果应用程序要为用户提供一组命令,使用菜单可以十分方便地给命令分组,它把功能
类似的命令放在同一个子菜单中,功能相距较远的命令放在不同的子菜单中。标准的Windows应用程序都会以菜单的方式为用户提供一组命令,使用户容易访问这些命令,增强界面的友好特性。可以说菜单是窗口界面的重要组成部分,通常一个Windo
ws应用程序的所有功能都能通过菜单命令的调用来完成,因此,菜单成为一个Windows应用程序功能的总汇。在实际应用中,菜单可分为两种基本类型:弹出式菜单和下拉式菜单。在使用Windows和其他应用软件时,我们经常见到这两种菜单。例如,打开Word后,单击“文件”菜单所显示的就是下拉式菜单,而用鼠
标右键单击文档编辑区时所显示的菜单就是弹出式菜单。弹出式菜单一般是当单击鼠标右键时出现的菜单,是显示在窗体上,独立于菜单栏的浮动菜单。弹出式菜单上显示的菜单项取决于鼠标右键按下时的鼠标指针所在的位置,因此,弹出式菜单又称为上下文菜单,应该用弹出式菜单提供一种访问公共的上下文命令的高效方
法。下拉式菜单是一种典型的窗口式菜单。一般通过单击菜单栏中菜单标题(如文件、编辑等)时,可以“下拉”出下一级的菜单,这样逐级下拉,用一个个窗口的形式弹出在屏幕上,操作完毕即可从屏幕上消失,并恢复原来的屏幕状态。在Windows及各种应用软件中,下拉式菜
单得到了广泛的应用,下拉式菜单的结构及组成元素如图11-1所示。图11-1下拉式菜单结构及组成元素1.菜单栏菜单栏又称为主菜单,出现在窗体的标题栏的下面,可包含一个或多个菜单标题。当单击一个菜单标题(如“文件”),包含菜单项目
的列表就被拉下来。2.菜单标题菜单标题是菜单栏中的一个元素,包括标题名称和热键。通过点击菜单标题或使用热键可以在菜单标题的下面出现一个下拉式菜单。3.菜单菜单是一个由多个菜单项或分隔条组成的上下排列的列表。由菜单标题直接拉出的菜单称为一级菜单,由一级菜单中的菜单项拉出的
菜单称为二级菜单,依次类推。4.菜单项菜单项是对要执行的命令的描述,可由标识文字、热键、快捷键组成。其中,热键、快捷键是菜单项的可选择项。菜单项的执行可由程序中的运行条件限制,当其呈灰色显示(如图11-1中的菜单项“粘贴(P)”)时,表
示此菜单项在此时不能被执行。要使您的应用程序简单好用,应该将菜单项按其功能分组。例如,图11-1中与编辑有关的命令“剪切”,“复制”,“粘贴”和“删除”等都列入“编辑”菜单。有些菜单项目直接执行动作,如“文件”菜单中的“退出”菜单项将关闭应用程序。有的菜单项会显示一个对话框,要求用户
提供应用程序执行动作所需信息,在这些菜单项后有省略符(...)。如图11-1中“编辑”菜单中的“设置字体”菜单项。无论你在应用程序中使用什么样的菜单和菜单项,都应该使它们保持清晰和一致。菜单和菜单项应该容易使用,并且应该尽可能与其它Windows应用程序保持一致。在创建菜单项时,请遵循下面的原则:
(1)使用由一个或(至多)两个简短单词组成的意义明确的标题。(2)程序中给每个菜单项分配唯一的热键,并尽可能使用菜单项的第一个字母作热键。5.分隔条在菜单中常出现一条条横线称为分隔条,它用来对菜单中的各菜单项进行分组,使整个菜
单安排得合理有序。6.热键热键是菜单项中带下划线的、由括号括起来的字符。按下热键可以执行该菜单项。7.快捷键快捷键是指菜单项中最左边的功能键或组合键。在程序运行过程中,按下快捷键就会执行该快捷键对应的菜单项。使用快捷键方式不需要弹出菜单。在VisualBasic中,菜单也是一个控件对象。与其他控
件一样,它具有定义外观与行为的属性,在设计或运行时可以设置Caption,Enabled,Visible等属性。菜单控件只包含一个事件,即Click事件,当用鼠标或键盘选择该菜单控件时,将调用该事件。
11.1.2菜单编辑器以前编写菜单程序是相当麻烦的,需要计算屏幕的位置,还需要保存和恢复屏幕区域等。但对于可视语言(如VisualBasic、VisualC++等)来说,菜单的设计要简单和直观得多,全部设计都在一个窗口内完成。【菜单编辑器】是VisualBa
sic提供的用于设计菜单的编辑器。使用【菜单编辑器】可以非常方便地增加新的菜单、修改和重新排列现有菜单以及删除以前设计的菜单,还可以使用它给菜单增加特殊效果,比如添加热键、选中标识以及快捷键等。【菜单编辑器】的主要优点是使用方便,它是设计和管理菜单的一个图形化
工具,可以在只用很少编程的全交互方式中自定义菜单。可以通过以4种方式打开【菜单编辑器】:(1)在菜单栏中单击“工具”,然后选择“菜单编辑器”。(2)在“工具栏”上单击“菜单编辑器”按钮。(3)使用快捷键Ctrl+E。(4)在要建立菜单的窗体上单击鼠标
右键,在弹出的菜单中选择“菜单编辑器”,如图11-2所示。图11-2用弹出菜单打开菜单编辑器这里指的是活动窗体,只有当某个窗体为活动窗体时,才能用上面的方法打开菜单编辑器窗口。打开后的【菜单编辑器】窗口如图11-3所示。图11-3菜单编辑器窗口1.菜单项属性区菜单项属性区分为若干栏,下面介绍一
下各栏的作用。(1)标题标题是一个文本框,用来输入所建立菜单的各个菜单项的名称。当在该项中输入标题后,这些菜单项的名称将在用户建立的菜单中显示出来,它相当于菜单对象的Caption属性。如果在命令执行之前要求用户输入更多信息,则可在菜
单项标题后面加上个省略号(...),例如“打开”菜单项。分隔线可把菜单项划分成若干个逻辑组,例如VisualBasic的“帮助”菜单,使用分隔线将其菜单项分成三组。如果想在菜单中建立分隔线,则应在标题框中输入一个连字符(-)。需要注意的是如果菜单控件
是一个菜单标题、带有子菜单项、被复选或无效、或者有一个快捷键,那么它就不能作为分隔符条。通常,为了让热衷于键盘的用户能够通过键盘快速访问菜单,可以为菜单或菜单项添加热键,热键是由程序员指定的,使用【菜单
编辑器】为菜单和菜单项添加热键支持是件容易的事。具体做法是在菜单名后的括号里用“&”符号连接一个字母。这样,在程序运行时,带有下划线的该字母(&符号是不可见的)将显示在菜单名后,按Alt+“该字母”就可以访问某个菜单或菜单项,设计和运行时的情况如图11-4和11-5所示。由于“
&”符号在菜单设计的中有了特殊意义,因此不可以直接使用,如果要在菜单中显示“&”符号,则应在标题中连续输入两个“&”符号。如图11-4菜单设计界面如图11-5菜单运行界面如果不指定热键,则VisualBasic中每个顶级菜单的第一个字母就是热键。用户看不到第一个字母有下划线,但是使用Alt加
上第一个字母也可以打开菜单。需要注意的是,不要为不同菜单建立相同的热键,否则只有第一次建立的热键才有效。其实,任何控件(菜单项也是控件),只要它有Caption(标题)属性,就可以为其指定热键。也就是说,热键是对控件的Ca
ption属性的设置。对于一般控件(即非菜单项),可以在设计阶段通过属性窗口在Caption属性中加“&”设置热键,也可以在程序代码中设置。但是,有些控件没有Caption属性,或者Caption属性被设置为空白,对于这样的控件,可以通过Tab键依照空位
顺序选取,但也可以通过热键选取。假定有一个文本框(或图片框),框内为空白,则可以用下面的方法设置热键:建立一个标签,在标签后面紧接着建立一个文本框,即让文本框紧跟在标签的后面。标签有Caption属性,因此可以对标签设置热键。当用户通过热键选取标签时,由于标签不接收输入
,因而把控制转移到位于其后的文本框。(2)名称“名称”输入框也是一个文本框,用来输入各菜单项的控制名,相当于菜单对象的Name属性。它用来在编辑程序代码时代表菜单项,不会在菜单中出现。菜单设置中的每一项,无论是菜单名还是菜单项,只要在标题框中已输入标题,就必须要为其取一个控制名,就像命
令按钮、文本框必须要设置Name属性一样。为了使代码更可读和更易维护,在菜单编辑器中设置Name属性时遵循已确定的命名约定是一个好办法。大多数命名约定规则都建议用前缀来标识对象,其后紧跟菜单的名称(如File)。一般在命名菜单的时候,都是由
前缀mnu加上一些有意义的字符组成,例如“文件”菜单一般就命名为mnuFile。用三个字母的标识作为用户界面元素的名称前缀有助于在大型程序中区分事件过程,并且前缀也能够帮助你在代码窗口中识别界面元素。(
3)索引“索引”输入框为一个文本框,用来建立控件数组下标,相当于控件数组的Index属性。控件数组是一组享有同一控件名而拥有不同属性的控件,即所有的菜单名称都相同,只是用不同的Index属性区分。(4)快捷键“快捷键”为一个列表框,用来设置菜单项快捷键,快捷键和热键类似,只是当用户按了
快捷键后,它不是打开菜单,而是直接执行菜单项的功能。例如VisualBasic6.0的“运行”命令,可以使用它的快捷键F5来直接运行程序。在快捷键列表框右侧有一个下拉箭头,单击这个箭头会出现一个列表,列出了可供用户选择的快捷键。快捷键将自动出现在菜单上,要删除快捷键应选取列
表顶部的“none”,注意在菜单条上的第一级菜单不能设置快捷键。可以为频繁使用的菜单项指定一个快捷键,它提供一种键盘单步访问的方法,而不是像使用热键那样,按住ALT键,再按菜单标题访问字符,然后再按菜单项访问字符的三步方法。快捷键的赋值包括功能键与控制键的组合,如
CTRL+F1键或CTRL+A键。设置过快捷键后,快捷键将自动出现在菜单中相应菜单项的右边。因此,不需要在【菜单编辑器】的“标题”框中键入CTRL+key等。(5)帮助上下文ID“帮助上下文ID”是一个文本框,用户可以输入
指定一个唯一的数值,这个数值用来选择帮助文件中特定的页数或与该菜单上下文相关的帮助文件。(6)协调位置“协调位置”为一个列表框,单击右侧的下拉箭头会出现一个下拉列表,用户可以通过这一列表框来确定菜单是否出现
或怎样出现。该列表有4个选项:0-None(缺省值)窗体的顶层菜单项不在对象菜单栏中显示1-Left窗体的菜单项在对象菜单栏的左边位置显示2-Middle窗体的菜单项在对象菜单栏的中间位置显示3-Right窗体的菜单项在对
象菜单栏的右边位置显示(7)复选“复选”决定在菜单项的左边是否设置复选标记,所谓复选标记,就是在菜单项的前面加上“√”。在程序运行时,选择该项时,可以在相应的菜单项旁加上“√”,不选择该项时,则没有“√”,通常用它指出切换选项的开关状态
。它不改变菜单项的作用,也不影响事件过程对任何对象的执行结果,只是设置或重新设置菜单项旁的符号。利用这个属性,一是可以指明某个菜单项当前是否处于活动状态;二是可以表示当前选择的是哪个菜单项。菜单项的标记通常是动态地加上或取消的,因此应在程序
代码中根据执行情况设置。在程序运行时要在一个菜单项上增加或删除复选标志,需要在代码中设置它的Checked属性。假如一个菜单项的名称是mnuB,则在某个时刻在它前面添加标记的代码为:mnuB.Checked=True要删除该菜单项的标记,只需要把它的Checked属
性设置为False,如:mnuB.Checked=False但是一般情况下,在单击一个菜单项时,希望交替地增加或删除复选标志,这时可以这样设置它的Checked属性:mnuB.Checked=NotmnuB.Checked(8)有效
在典型的Windows应用程序中,并非所有的菜单项都同时可用。“有效”决定是否让菜单项对事件作出响应,相当于控件的Enabled属性。当有效复选框被选中时(即属性值被设置为True),表示当前高亮度的菜单项为可以执行的
;未被选中时(即属性值被设置为False),相应菜单项在执行时变为灰色,表示不能被用户操作。在程序运行时,菜单中的某些菜单项应能根据执行条件的不同进行动态变化,即当条件满足时可以执行,否则不能执行。这样,
既可以提示用户,又可以防止出现误操作。例如,在典型的Edit(编辑)菜单中,只有当剪贴板上保存有数据时Paste(粘贴)菜单项才有效,当剪贴板中没有内容时,“粘贴”命令就没有了使用的意义,这时候可以把它变为灰色,表示不可用。假如一个菜单项的名称是m
nuEdit,如下代码可以将使它无效:mnuEdit.Enabled=False如果在某个时刻想使它重新有效,只需使用如下代码:mnuEdit.Enabled=True(9)可见“可见”选项决定菜单项在程序运行时
是否被显示,相当于控件的Visible属性。默认情况下,此复选框被选中(即属性值被设置为True),表示当前菜单项在程序运行时被显示出来;未被选中时(即属性值被设置为False),则该菜单项在运行时和开发环境中都不会在窗体中显示。如果一个菜单项是不可见
的,则其所有子菜单也是不可见的。当一个菜单项不可见时,菜单中的其余菜单项会上移以填补空出的位置。如果菜单位于菜单栏上,则菜单栏上其余的控件会左移以填补该位置。在运行时,要使一个菜单控件可见或不可见,可以在代码中设置其Visible属性。假如
一个菜单项的名称为mnuP,则如果在某个时刻使它不可见,可以使用如下代码:mnuP.Visible=False在某个时刻,又需要该菜单项显示,则把它的Visible属性设置为True就可以了,如:mnuP.Visible=True(10)显示窗口列表该复选
框可设置在使用多文档应用程序时,是否使菜单控件中有一个包含打开的多文档文件子窗口的列表框,在后面的章节中还有介绍。2.编辑区编辑区共有7个按钮,用来对输入的菜单项进行简单的编辑,下面把这几个按钮的功能进行简要的介绍。(1)左右箭头按钮左右箭头按钮用于将菜单项向左或向右缩进四格距离,改变该
菜单项在菜单列表框中的缩进位置,决定该菜单是菜单标题、菜单项、子菜单标题或子菜单项。单击一次右箭头,则产生四个点,把选定的菜单下移一个等级,一共可以创建4个子菜单等级(共五个等级);单击一次左箭头,则删除四个
点,把选定的菜单上移一个等级。所创建的每个菜单可以包含最多五级子菜单,子菜单会分支出另一个菜单以显示它自己的菜单项。需使用子菜单的场合有:①菜单栏已满;②某一特定菜单控件很少被用到;③要突出某一菜单控件与另一个的关系。然而,如果菜单栏中还有空间,最好再创建一个菜单标题而不是子菜单。这样
,当菜单拉下时所有控件都可见。限制使用子菜单也是一种好的编程策略,它可以免去查找应用程序菜单界面的负担(大多数应用程序都只使用一级子菜单)。如果想用多于一级的子菜单,可以考虑使用对话框来替代,对话框允许在一个地方指定好几个选
择。关于使用对话框的内容,请参阅本章后面的“对话框”内容。(2)上下箭头按钮上下箭头按钮可将选中的菜单项向上或向下移动一位,从而改变菜单中各菜单项的顺序。使用上下箭头的时候,首先选中一个菜单项,使这一菜单项高亮度显示,当单击向上按钮时,该菜单项上移一位,与它上面的菜单项交换位置;
单击向下按钮时,该菜单项下移一位,与它下面的菜单项交换位置。很多时候,第一次定义菜单项时很难保证所做的决定周全无误,所以改变菜单项的次序是个必须掌握的重要技巧。(3)“下一个”按钮单击该按钮将选定光标移动到下一行,它与回车键的作用相同。设置好一个菜单项的属性后,单击此按钮可
设置下一个菜单项的属性。(4)“插入”按钮该按钮用来插入新的菜单项。当建立了多个菜单项后,如果想在某个菜单项前插入一个新的菜单项,可先选中该菜单项(即单击该菜单项,把光标移动到该菜单项上),然后单击“插入”按钮,选中的菜单项将
下移一行,上面空出一行,用户可在这一行设置新的菜单项。(5)“删除”按钮该按钮用于删除某个菜单项。在删除菜单项的时候,首先选中要删除的菜单项,然后单击“删除”按钮就可以了。3.菜单项显示区在【菜单编辑
器】窗口的下部是一个空白列表框,称为菜单项显示区,这里列出了用户为某个窗体设计的所有菜单。用户设计菜单时,在【菜单编辑器】窗口中编辑好的菜单会立刻在列表框中显示出来,并通过内缩符号(….)表明菜单项的层次,光标所在的菜单项就是“当前菜单项”。尽管大多数菜单控件属性可用【菜单
编辑器】设置,所有的菜单属性在“属性”窗口中也都是可用的。通常,在【菜单编辑器】中建立菜单,但要快速改变单个属性,一般使用“属性”窗口。11.1.3用菜单编辑器建立菜单建立一个菜单,首先要列出菜单的组成,然后在【菜单编辑器】窗口按着菜单组成进行设计。使用【菜单编辑器
】在当前窗体中创建菜单界面的一般步骤如下:(1)用我们上节介绍的打开【菜单编辑器】的方法,打开【菜单编辑器】。(2)【菜单编辑器】启动后,会出现一个空的项,在此项的“标题”栏中,为第一个菜单标题键入希望在菜单栏上显示的文本。如果希望某一字符成为该菜单项的热键,也可以在该字符前面加上一个(&)字符
。在菜单中,这一字符会自动加上一条下划线。(3)在“名称”文本框中,键入将用来在代码中引用该菜单项的名字。(4)单击向左或向右箭头按钮,可以改变该菜单项的缩进级。(5)如果需要的话,还可以设置控件的其他属性。这一工作可以在菜单编辑
器中做,也可以以后在“属性”窗口中做。(6)单击“下一个”按钮就可以再建一个菜单项。(7)重复第(3)到第(6)步骤,可以生成其他的菜单项。(8)检查所建立的菜单,看是否需要修改。可以单击“插入”在现有的
菜单项之间增加一个菜单项;也可以单击向上与向下的箭头按钮,改变现有菜单项的顺序;选中某个菜单项,可以单击“删除”按钮删除该菜单项,还可以改变该菜单项的其他属性。(9)如果窗体所有的菜单项都已创建,并确认无误时,单击“确定”按钮关闭【菜单编辑器】,创建的菜单
将显示在窗体上。当把菜单增加到窗体上后,就可以编写事件过程来处理菜单命令。菜单的最主要事件就是Click事件,对该事件编程就可以实现菜单的操作。例11-1(参看教材P197)例11-2(参看教材P197-200)例11-3(参看教材P200-201)11.1.4菜单项的增减我们用前面的方法建立的
菜单是固定的,菜单项不能自动增减。为了增加或减少菜单项,必须打开【菜单编辑器】,对原来的菜单进行增删。在Word的“窗口”菜单中,其子菜单可以根据当前打开文件的多少而动态变化。每打开一个文件,在“窗口”菜单中就增加一个子菜单项。每关闭一个文件,“窗口”菜单中就减少一个子菜单项。在实际
应用中,有时候需要这种自动增减菜单项的操作,这一节就介绍如何实现这种操作。在运行时对菜单项进行增加或删除,必须使用菜单控件数组。菜单控件数组就是在同一菜单上共享相同名称和事件过程的菜单项目的集合。菜单控件数组使用于:(1)在运行时创建一个新菜单项;(2)简化代码,因为通用代码块可以被所有
菜单项使用。每个菜单控件数组元素都由唯一的索引值来标识,该值在【菜单编辑器】上“Index属性框”中指定。当一个控件数组成员识别一个事件时,VisualBasic将其Index属性值作为一个附加的参数传递给事件过程。
事件过程必须包含有核对Index属性值的代码,因而可以判断出正在使用的是哪一个控件。要在【菜单编辑器】中创建菜单控件数组,请按照以下步骤执行:(1)选取窗体,打开【菜单编辑器】;(2)在“标题”文本框中,键入想出现在菜单栏中的第一个菜单标题的文本;在“名称
”文本框中,键入将在代码中用来引用菜单控件的名称,保持“索引”框是空的;(3)在下一个缩进级,通过设定“标题”和“名称”来创建将成为数组中第一个元素的菜单项;将菜单项“索引”设置为0,它自动地成为控件数组的一个元素——即使还没有创建其它元素
;(4)在第一个元素的同一缩进级上创建第二个菜单项,将第二个元素的“名称”设置成与第一个元素相同,且把它的“索引”设置为1;(5)对于数组中的后续元素重复步骤(3)和(4)。菜单控件数组的各元素在菜单控件列表框中必须是连续的,而且必须在同一缩进级上。创建菜单控
件数组时,要把在菜单中出现的分隔符条也包括进去。运行时所创建的控件可以使用Hide方法或者设置该控件的Visible属性为False来隐藏。如果要从内存中删除一个控件数组中的控件,请使用UnLoad语句。例11-4(参看教材P202-204)11
.1.5弹出式菜单前面我们详细的介绍了下拉式菜单,在实际应用中,还广泛的使用弹出式菜单,任何至少有一个菜单项的菜单,运行时都可以显示为弹出式菜单。弹出式菜单也称为快捷菜单或上下文菜单,它是一种小型菜单,可以在窗体的某个地方显示出来,对程序事件做出响应。与拉下式菜单不同,弹
出式菜单不需要在窗口顶部下拉打开,它可以根据用户单击鼠标的位置(一般是右键单击),动态地调整菜单项的位置,能以灵活的方式为用户提供更加便利的操作。弹出式菜单通常包含经常使用的命令,并且随着当前对象的不同而变化。建立弹出式菜单通常分为两步进行:首先用【菜单编辑器】
建立菜单,然后用PopupMenu方法显示弹出式菜单。第一步的操作与前面介绍的基本相同,唯一的区别是需要把菜单名(即顶级菜单)的“可见”属性设置为False(子菜单项不要设置为False)。PopupMenu方法的语法为:[对象.]Popu
pMenu<菜单名>[,Flags[,X[,Y[,BoldCommand]]]]说明:(1)对象是可选的,它是一个对象表达式,可以是窗体对象或其他的可以应用弹出式菜单的对象。如果省略该参数,则将打开当前窗体的菜单。(2)菜单名是必须的,是要显示的弹出式菜单的
名称。指定弹出的菜单至少应该有一个子菜单项。(3)X和Y用来指定弹出式菜单显示位置的横坐标(X)和纵坐标(Y)。如果省略,则弹出式菜单在鼠标光标的当前位置显示。X和Y可以省略一个,也可全部省略。(4)BoldCommand是可选的,用来指定弹出式菜单的菜单控件的名字,用来显示其黑体正文标题。如果该
参数省略,则弹出式菜单中没有以黑体字出现的控件。(5)Flags是可选的,它是一个数值,用来指定弹出式菜单的位置和行为,使用Flags参数可以进一步定义弹出式菜单的位置与性能,其取值如表11-4所示。表11-4Flags参数值参数参数
值VB常数描述位置常数0(默认)vbPopupMenuLeftAlign菜单的左边界位于X4vbPopupMenuCenterAlign菜单的中心位于X8vbPopupMenuRightAlign菜单的右边界位于
X行为常数0(默认)vbPopupMenuLeftButton仅当鼠标左键单击时,才能选择菜单命令2vbPopupMenuRightButton无论是鼠标左键单击还是右键单击,都能选择菜单命令可以从位置常数和行为常数各选取一个常数,然后相加或者用or操作
符将它们连起来,做为Flags参数的值。在显示弹出式菜单时,直到菜单中被选取一项或者取消这个菜单时,调用PopupMenu方法后面的代码才会运行。此外,每次只能显示一个弹出式菜单,在已经显示一个弹出式菜单的情况下,对后面的调用PopupMenu方法将不予理睬。在一
个菜单控件正活动的任何时刻(比如有弹出式菜单显示或者打开了下拉菜单),调用PopupMenu方法也不会被理睬。例11-5(参看教材P205-206)11.2对话框设计11.2.1对话框概述11.2.2通用对话框11
.2.3通用对话框的使用11.2.4自定义对话框在VisualBasic应用程序中,用户经常使用三种类型的对话框:一是系统预定义对话框,比如我们前面介绍的输入对话框(InputBox)和信息框(MsgBox);二是通
用对话框;三是用户自定义的对话框。第一种对话框我们前面已经介绍过,本章介绍的对话框主要是后两种对话框。11.2.1对话框概述在VisualBasic中,对话框是一种特殊的窗体,它通过显示和获取信息与用户进行交流。尽管对话框有自己的特性,但从结构上来说,对话框与窗体是
类似的,具有窗体的特性和功能。一个对话框可以很简单,也可以很复杂。简单的对话框可用于显示一段信息,并从用户那里得到简短的反馈信息。利用较复杂的对话框,可以得到更多的信息,或者设置整个应用程序的选项,如图11-11所示,它是Word中的一个较为复杂的对话框。图11-1
2Word中的一个对话框如前所述,对话框与窗体是类似的,但是它也有自己的特性,主要表现以下几个方面:(1)在一般情况下,用户没有必要改变对话框的大小,因此其边框是固定的。(2)为了退出对话框,必须单击其中的某个按钮,不能通
过单击对话框外部的某个地方关闭对话框。(3)在对话框中不能有最大化按钮和最小化按钮,以免被意外地扩大或缩成图标。(4)对话框不是应用程序的主要工作区,只是临时使用,使用后就关闭。(5)对话框中控件的属性可以在设计阶段设置,但在有些情况下,必须在运行时设置控件的属性,因为某
些属性设置取决于程序中的条件判断。根据焦点转移方式的不同,对话框可以分为模态对话框和非模态对话框。由于大多数对话框需要用户的交互作用,所以通常显示为模态对话框。在继续使用应用程序的其它部分以前,必须关闭(隐藏或卸载)模态对话框。如果一个对话框在切换到其它窗体或其它对话
框前必须单击“确定”或者“取消”,那么这个对话框就是模态对话框。例如,VisualBasic中“文件”菜单的“新建工程”对话框就是一个模态对话框。非模态对话框不需要关闭就可以使焦点在该对话框和其它窗体之间移动,对话框显示时,可以在当前应用程序的其它地方继续工
作。因为通常应用程序继续前需要响应才显示对话框,所以非模态对话框很少。例如,VisualBasic中“编辑”菜单的“查找”对话框就是一个非模态对话框。11.2.2通用对话框在Windows系统中,一些常用的对话框功能是非常相似的,例如:打开、另存为、颜色、字体、打印机和帮
助对话框,这些对话框称为通用对话框。通用对话框是一种ActiveX控件,这个控件文件在系统目录下,名称为Comdlg16.ocx或Comdlg32.ocx。一般情况下,启动VisualBasic后,在工具箱中没有通用对话框控件(CommonDialog控件)。为了把C
ommonDialog控件添加到工具箱中,可以按如下步骤操作:(1)在“工程”菜单中单击“部件”菜单项,打开“部件”对话框。图11-14通用对话框(2)在对话框中选择“控件”选项卡,然后在控件列表框中选中“MicrosoftCommonDialogControl6.0”复选框。如图1
1-12所示。(3)单击OK按钮。CommonDialog控件出现在工具箱中,如图11-13所示。图11-12定制CommonDialog控件图11-13通用对话框把CommonDialog控件添加到工具箱后,有两种方法可以把通用对话框对象添加到窗体上:
(1)单击工具箱中的CommonDialog控件,然后在窗体的适当位置绘制该控件;(2)双击CommonDialog控件,则该控件出现在窗体上的默认位置。CommonDialog控件添加到窗体上后,它将自动调整本身的大小,只以一种大小
显示。在程序运行时,用户也看不到该对象(由于该对象不可见,因此可以把它放置在窗体上的任何位置)。将通用对话框对象放置到窗体上后,就可以在程序中使用它了。通用对话框对象允许在程序中显示6种标准对话框。每种标准对话框都可以使用与该
对话框相对应的方法来显示,而这些方法可以由一个通用对话框对象提供。通用对话框对象提供的标准对话框以及在程序中使用指定对话框的方法如表11-4所示。表11-4CommonDialog控件的方法方法显示的操作对话框ShowOpen显示【打开】对话框ShowSa
ve显示【另存为】对话框ShowColor显示【颜色】对话框ShowFont显示【字体】对话框ShowPrinter显示【打印】或【打印选项】对话框ShowHelp调用Windows帮助引擎为了在程序中显示通用对话框,需要在事件过程中使用合
适的对象方法来调用通用对话框对象。必要时,还必须在程序代码调用通用对话框对象之前设置通用对话框的一个或多个属性。当在程序运行时,用户在对话框输入内容后,用户的输入内容在对话框的一个或多个属性中返回,然后程序中就可以
使用这些属性来完成有意义的工作了。上面介绍了使用相应的方法显示不同类型的对话框,我们还可以通过设置通用对话框的Action属性,控制通用对话框的类型,如表11-5所示。表11-5Action属性和对话框类型Action属性值显示的操作对话框0无任何动作1显示【打开】对话框2显示【另存为】对话框3
显示【颜色】对话框4显示【字体】对话框5显示【打印】或【打印选项】对话框6调用Windows帮助引擎通用对话框除了Action属性外,还有几个基本属性,如:(1)DialogTiltle:该属性是通用对话框显示时的标题,是一个String值。在显示【颜色】、【字体】或【打印】对话框时,
CommonDialog控件忽略DialogTiltle属性的设置。在【打开】对话框中,缺省的标题是“打开”。在【另存为】对话框中,缺省的标题是“另存为”。(2)CancelError:该属性决定当用户单击了对话框的“取消”按钮时是否产
生错误信息。它是一个Boolean值,如果该属性被设置为True,则当用户选择取消按钮时,全局对象Err的Number属性被设置为32755,程序中可以判断此变量来进行对应的操作。通用对话框的属性既可以在“属性窗口”中设定,也可以在“属性页”对话框中设定。调出“属性页”对话框,可以在窗体上右键单
击CommonDialog控件,选择“属性”,还可以在“属性窗口”中双击“自定义”,“属性页”对话框如图11-14所示。图11-14“属性页”对话框的“打开/另存为”标签11.2.3通用对话框的使用1.【打开】和【另存为】对话框使用Common
Dialog控件显示【打开】和【另存为】对话框,有两种途径:(1)使用ShowOpen和ShowSave方法。例如要显示【打开】对话框,可以用下面的语句:CommonDialog1.ShowOpen(2)设置Action属性值,当值为1显示【打开】对话框,当
值为2显示【另存为】对话框。例如要显示【另存为】对话框,可以使用:CommonDialog1.Action=2两个对话框均可用以指定驱动器,目录,文件扩展名和文件名。【打开】和【另存为】对话框除了标题不同外,它们的外观上相似的。【打开】对话框如图11-1
5所示。图11-15【打开】对话框【打开】和【另存为】对话框放在一起,可以称为文件对话框,它们共同的属性如下:(1)DefaultEXT属性设置对话框中默认文件类型,即扩展名,是一个字符串(String)值。该扩展名出现
在“文件类型”栏内,如果在打开或保存的文件名中没有给出扩展名,则自动将DefaultEXT属性值作为其扩展名。(2)DialogTiltle和CancelError属性这两个属性,前面上节已经介绍过,这里就不再赘述。(3)FileName属性该属性用来设置或
返回要打开或保存的文件的路径及文件名。可以在打开对话框之前设置FileName属性设定初始文件名,运行时选定文件并关闭对话框后,可以用此属性获得选取文件的路径及文件名。(4)FileTitle属性该属性用来指定对话框中所选择的文件名(不包括路径)。该属性与FileName属性
的区别是:FileName属性用来指定完整的路径,如:“d:\vb书稿\第11章\大纲.doc”;而FileTitle属性只指定文件名,如“大纲.doc”。(5)Filter属性用来指定对话框中显示的文件类型。用该属性可以设置多个文件类型,供用户在对话框的“文件类型”的下拉列表中选择。该
属性是一个String值,其值由一对或多对文本字符串组成,每对字符串用管道符“|”隔开,在“|”前面的部分称为描述符,后面的部分一般为通配符和文件扩展名,称为“过滤器”,如*.txt,*.exe等。其格式如下:[窗体.]对话框名.Filter
=描述符1|过滤器1|描述符2|过滤器2|描述符3|过滤器3|……下面的代码给出一个例子,允许用户只能选择文本文件或含有位图和图标的图形文件:CommonDialog1.Filter="文本文件(*.
TXT)|*.TXT|位图文件(*.BMP)|*.BMP|图标文件(*.ICO;*.CUR)|*.ICO;*.CUR"(6)FilterIndex属性该属性用来指定默认的过滤器,其值为一个整数。用Filter属性设置多个过滤器后,每个过滤器都有一个值,第
一过滤器的值为1,第二个过滤器的值为2……用FilterIndex属性可以指定作为默认显示的过滤器。例如:CommonDialog1.FilterIndex=2将把第二个过滤器作为默认显示的过滤器。(7)
Flags属性在各种方法的对话框中都有Flags属性,这是一个标志,但具体含义并不相同。在文件对话框中,Flags属性可用来返回或设置【打开】和【另存为】对话框的标志选项。例如当覆盖文件之类的动作发生时,则可使用Flag
s属性提示用户。Flags属性是一个长整数值,可以使用3种形式,即符号常量、十六进制整数和十进制整数。在文件对话框中,Flags属性的值和含义如表11-6所示。表11-7文件对话框中Flags属性的取值及
含义符号常量十六进制整数十进制整数作用cdlOFNAllowMultiselect&H200&512允许用户选择多个文件,所选择的文件名存放在FileName中,各文件名用空格隔开。cdlOFNCreatePrompt&H20
00&8192如文件不存在,询问用户是否要建立新文件。cdlOFNExtensionDifferent&H400&1024指示返回的文件扩展名与DefaultExt属性指定的扩展名不一致。cdlOFNExplorer&H80000&52428
8它使用类似资源管理器中的打开一个文件的对话框模板,适用于Windows9x和WindowsNT4.0。cdlOFNFileMustExist&H1000&4096禁止输入对话框中没有列出的文件名,如果用户输入非法文件名时,显示一个
警告。cdlOFNHideReadOnly&H4&4隐藏只读复选框cdlOFNLongNames&h200000&2097152使用长文件名cdlOFNNoChangeDir&H8&8保留当前目录cdlOFNNoLongNames&
h40000&262144无长文件名cdlOFNNoReadOnlyReturn&H8000&32768选择的文件不是只读文件,并且不在一个写保护的目录中。cdlOFNNoValidate&H100&256允许在文件名中有非法字符cdlOFNOverwritePrompt&H2&2如果
用已经存在的文件名保存文件,则询问用户是否覆盖该文件。cdlOFNPathMustExist&H800&2048只允许输入有效的路径,如果输入非法路径,则显示警告cdlOFNReadOnly&H1&1在对话框中显示“只读检查”复选框。cdlO
FNShareAware&H4000&16384对话框忽略网络共享冲突的情况cdlOFNShowHelp&H10&16对话框显示一个帮助按钮表11-7文件对话框中Flags属性的取值及含义续表Flags属性允许设置多个值,这可以通过以下两种方法实
现:如果使用符号常量,则将各值之间用“Or”运算符连接如果使用数值,则将需要设置的属性值相加当设置多个Flags属性值时,注意各值之间不要发生冲突。(8)InitDir属性用来指定对话框中显示的起始目录。如果没有设置InitDir属性,则显示当前目录。(9)MaxFileSize属性设定F
ileName属性的最大长度,以字节为单位。取值范围为1~2048,默认为256。(10)HelpConText属性用来确定HelpID的内容,与HelpCommand属性一起使用,指定显示的Help主题。(11)He
lpCommand属性指定Help的类型,可以取以下几种值:1—显示一个特定上下文的Help屏幕,该上下文应先在通用对话框控件的HelpConText属性中定义。2—通知Help应用程序,不再需要指定的Help文件。3—显示一个帮助文件的索引屏幕。4—显示标准的“如何使
用帮助”窗口。5—当Help文件有多个索引时,该设置使用HelpConText属性定义的索引成为当前索引。257—显示关键词窗口,关键词必须在HelpConText属性中定义。例11-6(参看教材P213-214)例11-7(参看教材P214-215)2.【颜色】对话框【颜色】对话框用以从
调色板选择颜色,或是生成和选择自定义颜色。如要使用“颜色”对话框,先设置CommonDialog控件中与颜色对话相关的属性,然后使用ShowColor方法或者设置Action属性值为3显示【颜色】对话框,
如图11-17所示。图11-17【颜色】对话框【颜色】对话框具有与文件对话框相同的一些属性,包括CancelError、DialogTitle、HelpCommand、HelpContext等,此外还有两个属性,即Color属性和Flags属性。Color属性用来设置初始颜色,并把在对
话框中选择的颜色返回给应用程序。该属性是一个长整数型。Flags属性的取值及含义见表11-8。表11-8【颜色】对话框中的Flags属性的取值及含义符号常量十六进制数值十进制数值含义cdlCCFullIOpen&H2&2打开完整对话框,包括自定义颜
色部分cdlCCPreventFullOpen&H4&4禁止选择“规定自定义颜色”按钮cdlCCRGBInit&H1&1为对话框设置初始颜色cdlCCShowHelp&H8&8使对话框设置初始颜色值Flags的属性的4个取值,其中cdlCCRGBInit是必需的,用它可以打开一个【颜色】对话框,
并可设置或读取Color属性。如果同时设置cdlCCRGBInit和cdlCCFullIOpen,则可打开完整的对话框,这时“规定自定义颜色”按钮是有效的;如果同时设置cdlCCRGBInit和cdlCCPreventFullOpen,则“规定自定义颜色”按钮是
无效的。例11-8(参看教材P216)3.【字体】对话框在VisualBasic中,文字的字体、大小、颜色、样式可以通过【字体】对话框或字体属性设置。使用CommonDialog控件的ShowFont方法或设置Act
ion属性值为4,可以显示【字体】对话框,如图11-18所示。图11-18【字体】对话框【字体】对话框的CancelError、DialogTitle、HelpCommand、HelpContext等属性,在文件对话框中已经
介绍过,【字体】对话框的Flags属性及其含义如表11-9所示。表11-10【字体】对话框中的Flags属性的取值及含义符号常量十六进制值十进制值含义cdlCFANSIOnly&H400&1024只允许选
择Windows字符集的字体,即不能只选择仅含符号的字体。cdlCFApply&H200&512使对话框的“应用”按钮有效cdlCFBoth&H3&3列出可用的打印机和屏幕字体cdlCFEffects&H100&256允许中划线、下划线和颜色效果cdlCFFixed
PitchOnly&H4000&16384只能选择固定字符间距的字体cdlCFForceFontExist&H10000&65536当试图选择不存在的字体或类型时,将显示出错信息。cdlCFHelpButton&H4&4显示一个“
帮助”按钮cdlCFLimitSize&H2000&8192只能选择由Min和Max属性规定范围内的字体大小cdlCFNoFaceSel&H80000&524288没有选择字体名称表11-10【字体】对话框中的Flags属性的取值及含义续表cdlCFNoSimulat
ions&H1000&4096不允许图形设备接口(GDI)字体模拟cdlCFNoSizeSel&H200000&2097152没有选择字体大小cdlCFNoStyleSel&H100000&1048576没有选择字体样式cdlCFNoVectorFont
s&H800&2048不允许矢量字体选择cdlCFPrinterFonts&H2&2只列出打印机字体cdlCFScalableOnly&H20000&131072只允许选择可缩放的字体cdlCFScreenFonts&
H1&1只显示屏幕字体cdlCFTTOnly&H40000&262144只显示TrueType型字体cdlCFWYSIWYG&H8000&32768只允许选择屏幕和打印机可用的字体。该属性应当与3和131072同时设置。使用【字体】对话框时,一旦在【字体】对话框中作出了选择,下列属性包含了与该
选择有关的信息:(1)FontName属性用来设置或返回文本所用的字体,是一个String值。(2)FontSize属性用来设置或返回文本所用的字体的大小。可以磅为单位指定字体尺寸,最大值为2160磅。(3)FontBo
ld属性用来设置或返回是否粗体(4)FontItalic属性用来设置或返回是否斜体(5)FontStrikethru属性用来设置或返回是否有删除线(6)FontUnderline属性用来设置或返回是否有下划线(7)Col
or属性用来设置或返回选定字体颜色若要使用字体样式属性FontBold、FontItalic、FontStrikethru和FontUnderline以及Color属性,必须设置cdlCFEffects标志。例11-9(
参看教材P218)4.【打印】对话框【打印】对话框允许用户指定打印输出的方法。用户可指定打印页数范围、打印质量、复制数目等。此对话框还显示有当前安装的打印机信息,并允许用户进行配置或重新安装新的缺省打印机。注意
,此对话框并不真正地将数据送到打印机上,它仅允许用户指定如何打印数据,必须编写代码实现用选定格式打印数据。通过使用CommonDialog控件的ShowPrinter方法,或者设置控件的Action属性值为5可显
示【打印】对话框,此对话框就是Windows系统的打印机的设置对话框,如图11-19所示。当计算机没有设置打印机时,调用此方法,则系统会提示安装打印机。图11-19【打印】对话框运行时,当用户在【打印】对话框做出选择后,下述属性将包含用户选项的信息:
(1)Copies属性指定要打印的份数。如果把Flags的属性值设置为262144,则Copies属性值总为1。(2)FromPage和ToPage属性指定打印文档的页范围,分别表示打印的起始页和结束页。如果要使用此属性,必须把Flags的属性
设置为2。(3)HDC属性是选定打印机的设备上下文,用于API调用。(4)Orientation页面定向(画像或风景)【打印】对话框的Flags属性及含义见表11-10所示。表11-11【打印】对话框的Fl
ags属性及含义符号常量十六进制值十进制值含义cdlPDAllPages&H0&0返回或设置“所有页”选项按钮的状态cdlPDCollate&H10&16返回或设置校验复选框的状态cdlPDDisablePrintToFi
le&H80000&524288禁止“打印到文件”复选框cdlPDHidePrintToFile&H100000&1048576隐藏“打印到文件”复选框cdlPDNoPageNums&H8&8禁止“页”选项按钮cdlPDNoSelection&H4&4禁止“选定范
围”选项按钮cdlPDNoWarning&H80&128当没有默认打印机时,显示警告信息cdlPDPageNums&H2&2返回或设置“页”选项按钮的状态cdlPDPrintSetup&H40&64显示“打印设置”对
话框cdlPDPrintToFile&H20&32返回或设置“打印到文件”复选框状态cdlPDReturnDC&H100&256在对话框的hDC属性中返回“设备环境”,hDC指向用户所选择的打印机cdl
PDReturnIC&H200&512在对话框的hDC属性中返回“信息上下文”,hDC指向用户所选择的打印机cdlPDSelection&H1&1返回或设置“选定范围”选项按钮状态【打印】对话框的Max和Min属性用来限制FromPage和ToPage的
范围,其中Min属性指定所允许的起始页码,Max属性指定所允许的最后页码。【打印】对话框还有一个PrinterDefault属性,该属性是一个布尔值,默认时为True。当PrinterDefault属性为True时,可以使用P
rinter对象按选定的格式打印数据,同时VisualBasic将对Win.ini文件作相应的修改,所有在【打印】对话框“设置”部分中作出的变更都将成为打印机的当前默认设置;如果该属性为False,则对打印机设置的改变不会保存
在Win.ini文件中,也不会改变打印机的当前默认设置。5.调用Windows帮助引擎使用CommonDialog控件的ShowHelp方法,或者设置控件的Action属性为6,可以运行Windows的帮助引擎(WINHELP3
2.EXE),并显示由HelpFile属性设定的一个帮助文件。通过HelpCommand属性的设置,可以告诉该帮助引擎想要哪种类型的联机帮助,比如是上下文相关,或是特定关键字的帮助等。使用ShowHelp方法前,必须将CommonDialog控件的HelpCommand和HelpFile属性
设置为其相应的一个常数或值,否则WINHELP32.EXE就不能显示帮助文件。11.2.4自定义对话框在很多情况下,系统定义的对话框在应用上都有一定的限制,为了满足需要,用户可以根据具体需要建立自己的对话框。自定义对话框也称为定制对话框,这种对话框由用户根据自
己的需要对窗体进行操作来实现。用窗体作为自定义对话框,需要在你的程序中增加新的窗体,并在窗体上增加输入和输出对象(如命令按钮、选取按钮和文本框等),它们可以为应用程序接收信息。典型状态是,对话框有两个命令按钮:其中一个按钮开始动作,而另一个按钮关闭该对话框而不做
任何改变,这两个按钮的Caption属性设置“确定”与“取消”。一般情况下,还要通过设置窗体的一些属性值来定义窗体的外观,我们有很大的自由来定义自定义对话框的外观。它可以是固定的或可移动的、模式的或无模式的。因为对话框是临时性的,用户通常不需要
对它进行移动、改变尺寸、最大化或最小化等操作,所以对话框通常不包括菜单栏、窗口滚动条、最小化与最大化按钮、状态条或者尺寸可变的边框。与对话框窗体的外观相关的属性见表11-11所示。表11-11与对话框窗体外观相关的属性属性值说明Bordersty
le0、1、3边框类型为固定的单个边框,防止对话框在运行时被改变尺寸ControlBoxFalse取消控制菜单MaxButtonFalse取消最大化按钮MinButtonFalse取消最小化按钮如果取消了“控制”菜单,则必
须向用户提供退出该对话框的其它方法。实现的办法通常是在对话框中添加命令按钮,其Caption属性一般为“取消”或者“退出”,并在该按钮的Click事件中添加代码隐藏或卸载该对话框。Unload语句把对话框从内存中删除,而Hide方法只是通过设置对话框的
Visible属性为False将其从视窗中删除。当卸载窗体时,该窗体本身以及它的控件都从内存中卸载(包括在运行时装入的任何控件)。当隐藏窗体时,该窗体以及它的控件仍留在内存中。当需要节省内存空间时,最好卸载窗体,因为卸载窗体可以释放内存。如果经常使用对话框,可以选取隐藏窗体。隐藏窗体仍可以保留与
它关联的任何数据,包括属性值、打印输出和动态创建的控件。窗体被隐藏后,可以继续从代码中引用隐藏窗体的属性与控件。当应用程序运行时,启动窗体会自动装入。想在应用程序中出现第二个窗体或对话框,可以用Show方法实现(
具体参见下一章的多重窗体设计)。要将窗体作为模式对话框显示,把Show方法的style参数值设置为vbModal(一个值为1的常数)。例如:将frmAbout作为模式对话框显示,则可以使用frmAbout.ShowvbModal。要将窗体作为无模式对话框显示,
请使用不带style参数的Show方法。如果我们设计开发一个管理系统,一般都会有一个登陆系统的界面,这个界面就可以是一个对话框样式,需要使用自定义对话框。如图11-20是一个管理系统的登陆对话框。图11-20一个自定义对话框