第6章VB界面设计.docx
《第6章VB界面设计.docx》由会员分享,可在线阅读,更多相关《第6章VB界面设计.docx(18页珍藏版)》请在冰点文库上搜索。
![第6章VB界面设计.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/eead559e-6ead-4d11-a016-66893e1fc02e/eead559e-6ead-4d11-a016-66893e1fc02e1.gif)
第6章VB界面设计
第6章VB界面设计
6.1基本要求
1.熟练掌握运用菜单编辑器建立菜单的方法;
2.掌握通用对话框的使用方法;
3.掌握窗体的显示与隐藏方法;
4.掌握在VB工程运用多重窗体的方法。
6.2知识点
1.通用对话框(CommonDialog)
VB的通用对话框CommonDialog控件就是提供了基于Windows的标准对话框。
CommonDialog控件不是VB的内部控件,它是ActiveX控件。
使用时选择“工程”菜单的“部件”命令,来打开“部件”对话框。
在其中选择“MicrosoftCommonDialogControl6.0”选项,将CommonDialog控件添加到工具箱。
VB通用对话框可以打开的Windows标准对话框界面有:
“打开”对话框,“另存为”对话框,“颜色”对话框,“字体”对话框,“打印”对话框和“帮助”对话框。
在使用通用对话框控件打开标准对话框时,必须对它的一个Action属性进行设置或调用该控件的Show方法,那样才能真正地打开标准对话框中某一种类型的对话框。
(1)打开对话框
当在程序中把Action属性值设置为1时或调用了ShowOpen方法,就可以打开通用对话框的“打开”对话框。
在“打开”对话框中,可以翻阅计算机的整个目录结构,查找所需要的文件。
如下图6-1所示。
图6-1打开对话框
要真正实现文件的打开需要设置几个必要的属性:
①FileName:
用于设置和得到用户所选的文件名(包括路径名),属性值为字符串。
②FileTitle:
用于返回文件名,不包含路径。
③InitDir:
用于指定初始化目录,或返回用户选择的文件目录。
④Filter:
用于设置对话框的文件类型列表框中的过滤器。
通过设定过滤器指定在文件类型列表框中显示的文件类型。
其格式为:
文件说明|文件类型
⑤FilterIndex:
当指定一个以上的过滤器时,需使用该属性确定哪一个作为默认过滤器显示,默认值为1。
(2)另存为对话框
当在程序中把Action属性值设置为2时或调用了ShowSave方法,就可以打开通用对话框的“另存为”对话框。
在“另存为”对话框中,可以翻阅计算机的整个目录结构,查找所需要的信息。
另存为对话框常用属性基本上与“打开”对话框相似,有一个DefaultExt属性是“另存为”对话框所特有的,它表示所存文件的默认扩展名。
(3)颜色对话框
当在程序中把Action属性值设置为3时或调用了ShowColor方法,就可以打开通用对话框的“颜色”对话框。
在“颜色”对话框的调色板中提供了基本颜色,还提供了用户的自定义颜色,即用户可以自己调色。
如图6-2。
图6-2颜色对话框
颜色对话框的常用属性是Color属性,当用户在调色板中选定颜色后,该颜色值赋给Color属性。
(4)字体对话框
当在程序中把Action属性值设置为4时或调用了ShowFont方法,就可以打开通用对话框的“字体”对话框。
在“字体”对话框中,拥有可供用户选择的字体。
如下图6-3。
图6-3字体对话框
在使用“字体”对话框之前,必须设置Flags属性,见下表。
假如没有设置Flags属性值,则使用“字体”对话框时会显示错误提示。
属性
Flags值
说明
CdlCFScreenFonts
1
屏幕字体
CdlCFPrinterFonts
2
打印机字体
CdlCFBoth
3
两者皆有
cdlCFEffects
100
出现删除线、下划线、颜色元素
(5)打印对话框
当在程序中把Action属性值设置为5时或调用了ShowPrinter方法,就可以打开通用对话框的“打印”对话框。
如下图6-4。
图6-4打印对话框
打印对话框不能直接处理打印任务,它仅是一个供用户选择打印参数的界面,所选参数存于各属性中,再由编程来处理打印任务。
属性如下表所示。
属性
说明
Copies
指定打印份数
FromPage
打印起始页号
ToPage
打印终止页号
(6)帮助对话框
帮助对话框用于制作应用程序的联机帮助,它可将已创建的帮助文件取出,并与界面连接起来,达到显示并检索帮助信息的目的。
当在程序中把Action属性值设置为6时或调用了ShowHelp方法,并且设定了HelpCommand、HelpFile属性值。
如:
CommonDialog1.HelpCommand=cdlHelpContents
CommonDialog1.HelpFile="c:
\windows\system32\winabc.hlp"
Me.CommonDialog1.Action=6
就可以打开通用对话框的帮助对话框。
如下图6-5所示。
图6-5帮助对话框
2.菜单编辑器
选择“工具”菜单的“菜单编辑器”命令,即可打开如图6-6所示的“菜单编辑器”窗口。
图6-6菜单编辑器
(1)菜单控件属性区
标题:
输入菜单标题及各菜单项的标题,也可以在菜单中创建分隔条。
名称:
输入菜单控件的名字,该名字用于在程序代码中引用菜单控件。
索引:
在创建菜单控件数组时作为索引。
快捷键:
允许为每个命令选定快捷键。
复选:
选择该项时,将一个复选框标志放置在菜单上(它只对子菜单项起作用)。
有效:
设置菜单或菜单项当前有效。
可见:
设置菜单或菜单项当前可见。
(2)编辑区
左、右箭头:
用来产生和消除内缩符号,即产生或消除子菜单。
上、下箭头:
每次单击都把选定的菜单项在同级菜单内向上、下移动一个位置。
下一个:
将选定移动到下一行。
插入:
在列表框的当前行上方插入新的菜单项。
删除:
删除当前选定的菜单项。
(3)菜单控件列表框区
①列表框区是用来列出当前窗体的所有菜单控件
②当在标题文本框中键入一个菜单项时,该项也会出现在菜单控件列表框中。
③在列表框中选取一个已存在的菜单控件,则可以编辑该控件的属性。
④菜单控件在列表框中的位置决定了该控件是菜单标题、菜单项、子菜单标题还是子菜单项。
3.弹出菜单设计
弹出菜单是独立于窗体菜单而显示在窗体上的菜单,其显示的位置取决于单击鼠标时指针的位置。
创建弹出菜单分为两步:
①建立弹出菜单:
使用菜单编辑器设计菜单,并设置弹出菜单的顶层菜单(主菜单项)为可见或不可见。
②设置弹出菜单显示方式:
使用PopupMenu方法来显示弹出菜单。
PopupMenu方法的使用形式:
[对象.]PopupMenu菜单名,标志,x,y
标志:
当标志为0时,弹出菜单的顶只能对鼠标左键起反应;当标志为1时,弹出菜单的顶只能对鼠标左键和右键都起反应;当标志为2时PopupMenu方法只能用在MouseDown事件过程。
4.多重窗体界面设计
①添加窗体:
创建一个新的窗体或把一个属于其他工程的窗体添加到当前工程中。
同一工程每个窗体的Name属性不能相同。
②设置启动对象。
5.有关窗体的语句、方法
①Load语句:
把窗体装入内存。
Load语句形式:
Load窗体名称
②Unload语句:
从内存中删除指定的窗体。
Unload语句形式:
Unload窗体名称
③Show方法:
显示一个窗体,他兼有加载和显示窗体两种功能。
其形式:
[窗体名称].Show[模式]
其中:
“模式”用来确定窗体的状态,有0和1两个值。
若“模式”为1,表示窗体是“模式型”(Modal)的,用户无法将鼠标移到其他窗口,也就是说,只有在关闭该窗体后才能对其他窗口进行操作。
若“模式”为1,表示窗体是“非模式型”(Modeless)的,可以对其他窗口进行操作。
“模式”的缺省值为0。
“窗体名称”缺省时为当前窗口。
④Hide方法:
将窗体暂时隐藏起来,并没有从内存中删除。
其形式为:
[窗体名称].Hide
6.多文档界面的设计
开发多文档界面的一个应用程序至少需要两个窗体:
一个MDI窗体和一个或若干个子窗体。
在不同窗体中共用的过程、变量应存放在标准模块中。
①创建和设计MDI窗体
MDI窗体的默认名称为MDIForm1,大部分的控件不能放置在MDI窗体中,在此窗体中只能放置菜单、具有Align属性的控件和具有不可见界面的控件。
②创建MDI子窗体
先创建一个新窗体(或者打开一个存在的窗体),然后将它的MDIChild属性设置为True。
③编写程序代码
建立了MDI父窗体、子窗体后,就可以根据要求编写程序代码,其过程与单一窗体相同。
④加载MDI窗体与子窗体
在MDI应用程序中,由于加载子窗体时,其父窗体(MDI窗体)会自动加载并显示。
当子窗体被设置为默认的启动窗体时,程序运行后子窗体和MDI窗体两者都会加载。
而加载MDI窗体时,其子窗体并不会随着MDI窗体的加载而自动加载,因此当设置MDI窗体为启动窗体时,程序运行后只有MDI窗体被加载,若要加载子窗体则应使用Show方法。
7.MDI的属性、事件
(1)MdiChild属性:
设置一个窗体是否被作为MDI子窗体在一个MDI窗体内部显示。
(2)ScrollBars属性:
设置一个MDI窗体是否有水平滚动条或垂直滚动条。
(3)WindowState属性
该属性可以取三种值:
若取值为0(默认值)表示正常显示窗体;取值为1表示最小化,即将窗体缩小为一个图标;取值为2表示最大化,即将窗体充满屏幕,在MDI应用程序中子窗体将充满MDI父窗体。
(4)Arrange方法:
用于重排MDI窗口中的子窗体或图标。
格式为:
MDI窗体.Arrange方式
其中:
“MDI窗体”是需要重新排列的MDI窗体名字,在该窗体内有子窗体或图标;“方式”指定重排MDI窗体中子窗体或图标的方式。
(5)QueryUnload事件
在一个窗体或应用程序关闭之前触发该事件。
当MDI窗体被卸载时,QueryUnload事件首先为MDI窗体调用,然后再为每一个打开的子窗体调用。
由于QueryUnload事件在窗体卸载之前被调用,因此可以在事件过程中编写代码,使得用户能够在窗体卸载前保存那些被修改的窗体。
6.3疑难解析
1.在工程中添加现有窗体时发生加载错误
在使用“工程”菜单中的“添加窗体”命令添加一个现存的窗体时经常发生加载错误,绝大多数是因为窗体名称冲突的缘故。
例如,假定当前打开了一个含有名称为Form1的工程,如果想把属于另一个工程的Form1窗体装入则肯定会出错。
其实窗体名和窗体文件名可以使用不同的名称,不一定非要相同,但是为了不造成混乱,二者的名称最好一致。
在一个工程中,可以有两个窗体文件名相同的窗体(须在不同的文件夹中),但是绝对不能同时出现两个窗体名相同的窗体。
2.装入多窗体程序时出现对象不存在的错误
对于单窗体程序的加载,通常可以通过.vbp文件,有时也可以直接单击.frm窗体文件。
但对于多窗体程序的加载必须通过.vbp文件,它把属于该工程的所有文件(包括.frm文件和.bas文件)装入内存。
如果通过单击多窗体程序中某一窗体文件,只能加载该窗体文件,其他文件不能自动装入内存,程序运行时将出现对象不存在的错误。
此外,对于多窗体程序的编辑,当变化了窗体数量后,必须重新保存工程文件,否则,工程文件不包括新增的窗体文件。
对于记录在工程文件中的窗体文件和模块文件,必须注意所在的目录位置。
在复制多窗体程序对应的文件时不要遗漏,否则,在下次加载时会产生对象不存在的错误。
3.多窗体调用时出现对象不存在的错误
当用Show方法调用其他窗体时,被调用的窗体必须用窗体对象名,而不是窗体文件名。
否则,会产生实时错误424,要求对象。
4.在窗体加载过程中使用SetFocus方法出现“无效的过程调用或参数”错误
焦点只能移动可视的窗体或控件上。
在窗体的Load事件完成前窗体或窗体上的控件是不可视的,所以不能在Form_Load事件中把焦点移到正在加载的窗体上,也不能在Load事件内使用SetFocus方法将焦点移到窗体上的控件。
此外,也不能把焦点移到Enabled或Visible属性被设置为False的窗体或控件。
如果已在设计时将Enabled或Visible属性设置为False,必须在使用SetFocus方法前将Enabled或Visible属性设置为True。
5.与窗体有关的事件
在首次用Load语句将窗体(假定该窗体在内存中还没有创建)调入内存之时依次发生Initialize和Load事件。
Initialize是在窗体创建时发生的事件。
在窗体的整个生命周期中,Initialize事件只触发一次。
用户可以将一个窗体装入内存或从内存中删除很多次,但窗体的建立只有一次。
也就是说,在用Load语句将窗体装入内存时会触发Load事件,但并不一定触发Initialize事件。
在窗体从内存中卸载时依次发生QueryUnload和Unload事件。
QueryUnload事件可提供造成窗体卸载的原因,即是单击“关闭”按钮,或是程序中执行Unload语句,或在应用程序中关闭,或者是在Windows中的关闭。
如果在QueryUnload事件中把QueryUnload的参数Cancel设置为True,就会忽略Unload语句,从而不卸载窗体。
所以QueryUnload提供了取消关闭窗体的机会,同时也允许在需要时从代码中关闭窗体。
如果使用End语句来结束程序,窗体不会接收到QueryUnload事件。
而窗体Activate事件仅当窗体成为活动窗口时才发生,窗体必须可见。
6.在程序中对通用对话框的属性设置不起作用
在程序中对通用对话框的属性设置必须注意语句的先后顺序,属性设置语句必须放在打开对话框语句前,否则在程序中对通用对话框的属性设置在本次使用中不起作用。
例如,下面的程序代码由于先打开对话框,再进行属性设置。
在第一次执行本段代码时,无法过滤文件,ShowOpen语句后面的属性设置语句对下一次执行ShowOpen有效。
CommonDialog1.ShowOpen
CommonDialog1.FileName="*.bmp"
CommonDialog1.InitDir="c:
\windows"
CommonDialog1.Filter="图片(*.bmp)|*.bmp|所有文件(*.*)|*.*"
CommonDialog1.FilterIndex=1
7.设置通用对话框的CancelError属性为True发生错误
当通用对话框的CancelError属性设置为True时,无论何时选择“取消”按钮,均产生32755(cdlCancel)号错误。
VB通过系统对象Err来记录程序运行期间所发生的错误。
Err对象的Number属性记录错误号,Description属性保存有关错误的说明。
例如,当在CancelError属性为True的通用对话框中选择“取消”按钮时,产生一个错误,Err.Number被设置为32755,Description属性被设置为“选择‘取消’”。
如果不对错误进行处理,VB将显示出错消息并停止程序运行。
为防止由于错误造成停止程序运行的问题,可以使用OnError语句捕获错误,然后根据捕获的错误进行处理。
常用OnError语句的形式有:
OnErrorResumeNext'忽略发生错误的命令行,执行下一句命令
OnErrorGoTo语句标号'当发生错误时转向执行标号所指定的命令行
对于捕获到的错误号,可用分支语句处理。
下面的程序说明当在颜色对话框内选取“取消”按钮时,CommonDialog1.ShowColor语句产生32755号错误。
OnError语句在捕获到错误后,转向执行标号ErrorHandler所指定的命令行。
在标签Label1上显示“放弃操作”,并忽略产生错误的那一行命令与标号之间的所有语句。
PrivateSubCommand1_Click()
OnErrorGoToErrorHandler'错误捕获语句
CommonDialog1.CancelError=True'使选取“取消”按钮时能对出错做出响应
CommonDialog1.ShowColor
Text1.ForeColor=CommonDialog1.Color'设置颜色
ExitSub'无错误时正常退出本过程
'以下为错误处理的语句
ErrorHandler:
IfErr.Number=32755ThenLabel1.Caption="放弃操作"
EndSub
8.在使用CommonDialog控件控制字体选择时出现下图6-7所示错误
这是由于没有设置CommonDialog控件的Flags属性,或属性值不正确。
通常设置该值为&H103,表示屏幕字体、打印机字体两者皆有之,并在字体对话框中出现删除线、下划线、颜色等元素。
注意数字前的符号&H,表示十六进制。
图6-7字体提示框
9.窗体菜单名、顶层菜单与菜单项的区别
通常出现在菜单栏上的菜单对象叫做菜单名,菜单名以下拉列表形式包含的内容为菜单项。
菜单项可以包括菜单命令、分隔条和子菜单标题。
当菜单名没有菜单项时称为“顶层菜单”,可直接对应一个应用程序。
菜单名、顶层菜单与菜单项都是在菜单编辑器中定义,它们的区别在于:
(1)菜单名、顶层菜单不能定义快捷键,而菜单项可以有快捷键。
(2)当菜单包含有热键字母(菜单标题中“&”后的字母)时,按Alt+热键字母可选择窗体顶部菜单栏中的菜单项,当子菜单打开时,按热键字母选择子菜单中的菜单项。
如果子菜单没有打开时,按热键字母无法选择其中的菜单项。
(3)尽管所有的菜单项都能响应Click事件,但是菜单栏中的菜单名通常不需要编写事件过程。
10.动态菜单创建后不显示
创建动态菜单必须结合菜单项数组,样本菜单项的属性设置如下表所示:
Name
Caption
Index
Visible
必需的
可以没有
0
False
表中Index为0,表示样本菜单项是数组的第一个元素,其下标为0。
样本菜单项的Name属性是必需的,它作为数组的名称。
Visible可以设为True,如果设为False表示初始时该菜单项不可见。
在程序中用Load语句创建菜单项,用Unload清除菜单项。
动态创建的菜单项继承了除了Index之外的绝大部分属性,所以要对Caption属性设置菜单标题。
另外,使用Load语句建立的菜单项对象的Visible属性为False,如果其Visible属性不设置为True,创建的菜单项不显示。
另外,样本菜单项在菜单系统中的位置决定了新菜单项出现的位置。
11.在制作工具栏时ToolBar控件无法装入图像
ToolBar控件装入的图像来自与它关联的ImageList控件,必须先将图像添加到ImageList控件中,然后,在ToolBar控件的“图像列表”下拉式列表框中设置与之关联的ImageList控件,并为ToolBar控件中各工具按钮选择对应的图像/标。
12.在制作工具栏时无法对ImageList控件进行编辑
若要对ImageList控件进行增加、删除图像,必须先在ToolBar控件的“图像列表”下拉式列表框设置“无”,也就是与ImageList控件切断联系,否则VB提示无法对ImageList控件进行编辑。
13.当改变子窗体的属性后不能自动显示该子窗体
MDI窗体有AutoShowChildren属性,决定是否自动显示子窗体。
如果它被设置为True,则当改变子窗体的属性后,会自动显示该子窗体;如果AutoShowChildren属性被设置为False,则改变子窗体的属性后,必须用Show方法把该子窗体显示出来。
6.4典型例题
例6-1编写一个简单的文本文件编辑器。
要求具有打开、复制、粘贴、保存、退出功能。
用户界面如下图6-8所示。
单击“剪切”菜单(mnuCut),将文本框Text1.text中选定的内容剪切到剪贴板;单击“复制”菜单(mnuCopy),将文本框Text1.text中选定的内容复制到剪贴板;单击“粘贴”菜单(mnuPaste),将剪贴板中的内容粘贴到文本框中当前插入点处;单击“打开”菜单(mnuOpen),打开“打开”对话框,输入要打开的文本文件名后,单击确定按钮后,文件在Text1中打开。
单击“保存”菜单(mnuSave),打开“保存文件”对话框,Text1.text中的内容以指定的路径及文件名保存。
单击“退出”菜单(mnuExit),结束程序。
图6-8例6-1程序界面
解答:
(1)新建工程,修改窗体的标题为“简易文本编辑器”。
(2)在窗体上右击鼠标,打开菜单编辑器,创建“剪切”、“复制”、“粘贴”、“打开”、“保存”、“退出”6个菜单。
(3)在窗体上添加一个文本框,调整其大小如上图所示。
(4)编写“剪切”菜单的单击事件过程,实现将文本框中的文本传送到剪帖板,并清除文本框内容。
PrivateSubmnuCut_Click()
Clipboard.SetTextText1.SelText
Text1.Text=""
EndSub
(5)编写“复制”菜单的单击事件过程,实现将文本框中的文本传送到剪帖板。
PrivateSubmnuCopy_Click()
Clipboard.SetTextText1.SelText
EndSub
(6)编写“粘贴”菜单的单击事件过程,实现将剪帖板中的文本传送到文本框。
PrivateSubmnuPaste_Click()
Text1.SelText=Clipboard.GetText()
EndSub
(7)编写“打开”菜单的单击事件过程,实现打开选择的文本文件,并将所有内容读入文本框。
PrivateSubmnuOpen_Click()
DimsAsString
Text1.Text=""
CommonDialog1.Action=1
OpenCommonDialog1.FileNameForInputAs2
DoWhileNotEOF
(2)
Input#2,s
Text1.Text=Text1.Text+s
Loop
Close#2
EndSub
(8)编写“保存”菜单的单击事件过程,实现将文本框中所有内容写入选择的文本文件。
PrivateSubmnuSave_Click()
CommonDialog1.Action=2
OpenCommonDialog1.FileNameForOutputAs1
Print#1,Text1.Text
Close#1
EndSub
(9)编写“退出”菜单的单击事件过程,结束程序的运行。
PrivateSubmnuExit_Click()
End
EndSub
6.5练习与思考
习题6-1新建工程,在Form1窗体上建立一个二级下拉菜单(菜单项见下表)运行时的窗体如图6-9所示。
请在“退出”菜单项中加入代码,使选择“退出”的时候能关闭程序。
菜单标题
菜单名称
备注
有效性
文件
File
一级菜单
有效
…打开
Open
二级菜单
无效
…退出
Exit
二级菜单
有效
图6-9习题6-1程序界面
习题6-2新建工程,在Form1窗体上放置一个列表框(初始值为空)和一个标签框,按下表建立菜单。
窗体标题显示的文字参照下图6-10。
菜单标题