首页 10章主讲(排)

10章主讲(排)

举报
开通vip

10章主讲(排)本章将介绍Visual Basic 6.0的界面设计。用户界面会极大地影响用户对应用程序的接受程度,即使你的代码优化得很好或者技术上很优秀,但如果没有一个友好的人机交互界面,用户将难以接受。使用Visual Basic 6.0可以快速设计出标准风格的Windows软件,但是要创建真正易用的图形界面,还有许多工作要做。 10.1 对话框 10.1.1通用对话框 在编程过程中,打开和保存文件、选择颜色和字体、打印和打印设置等是大多数应用程序都有的操作。为了减轻程序员的工作量,同时也为其建立一个规范化的界面环境,使编...

10章主讲(排)
本章将介绍Visual Basic 6.0的界面设计。用户界面会极大地影响用户对应用程序的接受程度,即使你的代码优化得很好或者技术上很优秀,但如果没有一个友好的人机交互界面,用户将难以接受。使用Visual Basic 6.0可以快速设计出标准风格的Windows软件,但是要创建真正易用的图形界面,还有许多工作要做。 10.1 对话框 10.1.1通用对话框 在编程过程中,打开和保存文件、选择颜色和字体、打印和打印设置等是大多数应用程序都有的操作。为了减轻程序员的工作量,同时也为其建立一个规范化的界面环境,使编写的程序看起来更加专业化,Windows以动态链接库(.dll文件)的形式提供了通用对话框。使用通用对话框,只需很少的代码就可以完成对上述操作的支持。 1. 通用对话框控件 CommonDialog是ActiveX控件,不是标准控件,在工具箱中一般是找不到的。为了在应用程序中使用 CommonDialog 控件,应将其添加到工具箱中。将通用对话框图标加到工具箱中的方法如下: 单击【 工程 路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理 】菜单的【部件】选项,或者用鼠标右键单击工具箱,在弹出的菜单中选择【部件】命令并打开,在【控件】对话框中选中【Microsoft Common Dialog Control 6.0】命令,单击【确定】按钮后就可以将通用对话框添加到工具箱中。这时工具箱中会多出 图标。设计时在窗体上绘制的通用对话框不能改变大小,运行时控件被隐藏。 把通用对话框添加到工具箱后,就可以像使用标准控件一样把它添加到窗体上,如图10.1.1所示。在程序运行时,窗体上的通用对话框图标是看不到的,所以一个通用对话框在窗体的位置无关紧要。在程序中,通过设置Action属性或调用Show方法来决定对话框的类型。 表10.1.1 通用对话框的调用方法 选择窗体上的这个控件,右键单击通用对话框图标,在弹出快捷菜单中选择【属性】命令,则打开它的【属性页】对话框,如图10.1.2所示。在【属性页】对话框中有【打开/另存为】、【颜色】、【字体】、【打印】和【帮助】选项卡。CommonDialog控件提供的对话框具体属性值和方法参见表10.1.1 例如,将名称为CommonDialog1的通用对话框设置为【字体】对话框可以用以下两种方法: CommonDialog1.Action= 4 CommonDialog1.ShowFont 同理,通过这两种方法也可调用其他对话框。 下面详细介绍对话框的属性和使用。 2. 使用【打开】对话框 打开文件是Windows应用程序中的常用操作。利用【打开】文件对话框可以选择文件, 可以以“列表”和“详细资料”等方式显示文件与文件夹,还可以新建文件夹。它比使用3个内部文件系统控件(驱动器列表框、 目录 工贸企业有限空间作业目录特种设备作业人员作业种类与目录特种设备作业人员目录1类医疗器械目录高值医用耗材参考目录 列表框和文件列表框)的组合功能更强。 注意:打开文件对话框并不能真正打开一个文件,它仅仅提供一个打开文件的用户界面,供用户选择所要打开的文件,目的是获取文件名,打开文件的具体工作还是要通过编程来完成。 打开对话框有关属性的含义如下。 (1)对话框标题(DialogTitle) 字符串类型,用于设置对话框标题,默认值为“打开”。 (2)文件名称(FileName) 字符串类型,用于设置对话框中“文件名称”的默认值,程序运行后该属性返回用户所选择的文件名(包括路径)。 (3)初始化路径(InitDir) 字符串类型,用于设置初始的文件目录,字符串中的字符表示某文件夹的名称。例如,执行语句:CommonDialogl.InitDir=“C:\Windows”,则对话框的文件显示窗口中显示的是文件夹“C:\Windows”中所指定类型的所有文件。程序运行后该属性返回用户所选择的目录名。如果不设置该属性,系统默认为当前目录。 (4)过滤器(Filter) 字符串类型,用于设置显示文件的类型。在显示【打开】对话框之前设置该属性。可设置若干种文件类型,各种类型间用符号“|”隔开,每种类型的格式为:列表框中显示内容|文件类型,文件类型中可使用通配符。例如,Filter属性值设置为“图片(*.gif; jpg)|*.gif; *jpg|所有文件(*.*)|*.*”,如图10.1.3所示。如果选择表项为“图片”则显示扩展名为gif和jpg的文件,等等。 使用这个属性还可以同时显示多个选定类型的文件,但是使用时要用分号把多个类型 分开。例如:“图片(*.gif; jpg)|*.gif; *jpg”。 例10.1.1 单击Command 1命令按钮则显示【打开】对话框,然后在窗体上输出在【打开】对话框中所选择文件的文件路径。 其代码如下所示: Private Sub Command1_Click() CommonDialog1.Filter = "图片(*.gif;jpg)|*.gif;*jpg|所有文件(*.*)|*.*" CommonDialog1.Action = 1 Form1.Print CommonDialog1.FileName End Sub (5)Flags属性 常量或者常量组合,类似于MsgBox函数的Option参数。完整的常量列表可以参考Visual Basic的帮助系统。例如,如果要使对话框中“以只读方式打开”的复选框不显示,就可以设置一个标记来隐藏它,如下面代码: Private Sub Commandl_Click() CommonDialogl.Flags = cdlOFNHideReadOnly CommonDialogl .InitDir = "C:\Windows\system32" CommonDialogl.ShowOpen End Sub 3. 使用【另存为】对话框 【另存为】对话框可以用来指定所要保存的驱动器、文件夹、文件名和扩展名。【另存为】对话框和【打开】对话框,除了标题栏上的文字不同之外,其他内容和用法是类似的,目的都是让用户选择或获得一个文件名。但同样,它并不能提供真正的存储文件操作,储存文件的操作需要编程来完成。 【另存为】对话框还有一个DefaultExt属性,表示所存文件的默认扩展名。 【打开】对话框和【另存为】对话框的另一个比较重要的属性是Flags属性。使用常量或者常量组合来设置Flags 属性,类似于MsgBox函数的Option参数。完整的常量列表可以参考Visual Basic的帮助系统。例如,如果要使对话框中“以只读方式打开”的复选框不显示,就可以设置一个标记来隐藏它,如下面代码: Private Sub Commandl_Click() CommonDialogl.Flags = cdlOFNHideReadOnly CommonDialogl .InitDir = "C:\Windows\system32" CommonDialogl.ShowOpen End Sub 4. 使用【颜色】对话框 通过使用CommonDialog控件的ShowColor方法,或将CommonDia1og控件的Action属性值设置为3,即可显示【颜色】对话框,如图10.1.4所示。【颜色】对话框用以从调色板选择颜色,或是生成和选择自定义颜色。 【颜色】对话框最重要的属性是Color属性,用于设置和返回选定的颜色值。 例10.1.2 演示显示【颜色】对话框并将窗体的BackColor设置为选定的颜色。其代码如下: Private Sub Command1_Click() CommonDialog1.CancelError = True    ' 设置“取消”为True On Error GoTo ErrHandler CommonDialog1.Flags = cdlCCRGBInit    '设置 Flags 属性 CommonDialog1.ShowColor    ' 显示“颜色”对话框 Form1.BackColor = CommonDialog1.Color    ' 设置窗体的背景颜色为选定的颜色 Exit Sub ErrHandler:    '按下“取消”按钮 End Sub 可以看到,程序没有办法知道用户关闭适用对话框是使用【确定】按钮还是【取消】按钮。如果事先把通用对话框控件的CancelError属性设置为True,则当用户选择【取消】按钮来关闭对话框时,会产生一个代号为32755的可捕获运行时的错误。 当程序执行到ShowColor方法时,通用对话框会暂停等待用户选择颜色,并单击对话框上的【确定】或【取消】按钮。单击【确定】按钮,选中有效,否则无效。 5. 使用【字体】对话框 通过使用CommonDialog控件的ShowFont方法,或将CommonDialog控件的Action 属性值设置为4,则可显示【字体】对话框,如图10.1.5所示。【字体】对话框用来为文字指定字体、大小、颜色和样式。 表10.1.2 【字体】对话框相关属性 如要要使用【字体】对话框,先设置通用对话框中与字体相关的属性,然后显示对话框。表10.1.2是与字体有关的属性。 在使用ShowFont方法前,必须先设置CommonDialog控件的Flags 属性为下列3个数或值中的一个。 cdlCFScreenFonts或1—— 使用屏幕字体。 cdlCFPrinterFonts或2—— 使用打印机字体。 cdlCFBoth或3—— 既可是屏幕字体,又可是打印机字体。 如将其设置为257,则在对话框中会出现颜色、效果等选项,如图10.1.5所示。 如果不设置Flags属性,将会显示一个信息框,提示“没有安装字体”,并产生一个运行错误。 例10.1.3显示【字体】对话框,通过该对话框可将文本框中的字体属性设置为所选定的字体。代码如下: Private Sub Command1_Click() CommonDialog1.CancelError = True    ' 设置“取消”为 True On Error GoTo ErrHandler CommonDialog1.Flags = cdlCFEffects Or cdlCFBoth    ' 设置 Flags 属性 CommonDialog1.ShowFont    ' 显示“字体”对话框 Text1.Font.Name = CommonDialog1.FontName Text1.Font.Size = CommonDialog1.FontSize Text1.Font.Bold = CommonDialog1.FontBold Text1.Font.Italic = CommonDialog1.FontItalic Text1.Font.Underline = CommonDialog1.FontUnderline Text1.FontStrikethru = CommonDialog1.FontStrikethru Text1.ForeColor = CommonDialog1.Color Exit Sub ErrHandler:    '按下“取消”按钮 Exit Sub End Sub 6. 使用【打印】对话框 通过使用CommonDialog控件的Show Printer方法,或将CommonDialog控件的Action 属性值设置为5,即可显示【打印】对话框(如图10.1.6)。 【打印】对话框可用以指定打印输出方式、被打印页的范围、打印质量、打印份数等等。这个对话框还包含当前安装的打印机的信息,并允许配置或重新安装缺省打印机。 注意:这个对话框并不给打印机传送数据,只是指定希望打印数据的情况。如果PrinterDefault属性为True,可以使用Printer对象按选定的格式打印数据。 表10.1.3 【打印】对话框相关属性 与【打印】对话框有关的属性参见表10.1.3。 例10.1.4 显示【打印】对话框。 其代码如下: Private Sub Command1_Click() Dim BeginPage%, EndPage%, NumCopies%, i% CommonDialog1.CancelError = True    ' 设置“取消”为 True On Error GoTo ErrHandler CommonDialog1.ShowPrinter    ' 显示“打印”对话框 BeginPage = CommonDialog1.FromPage    ' 从该对话框取得选定的值 EndPage = CommonDialog1.ToPage NumCopies = CommonDialog1.Copies For i = 1 To NumCopies ' 此处放置将数据发送到打印机的代码 Next i Exit Sub ErrHandler:  '按下“取消”按钮 Exit Sub End Sub 若将PrinterDefault属性设置为True,则可在Printer对象上打印。另外,若PrinterDefault属性为True时,则所有对【打印】对话框“设置”的相关选项做出的变更,都将改变用户“打印机”设置的值。 表10.1.4 【帮助】对话框相关属性 7. 显示【帮助】文件 通过使用CommonDialog控件的ShowHelp方法,或将CommonDialog控件的Action属性值设置为6,即可运行Windows的帮助引擎(Winhelp.exe),并显示由HelpFile指定的一个帮助文件。通过HelpCommand属性的设置,可以告诉该帮助引擎想要哪种类型的联机帮助,比如是上下文相关,或是特定关键字的帮助,等等。 【帮助】对话框有关的属性参见表10.1.4。 例10.1.5 演示【帮助】对话框,通过该对话框显示指定的帮助文件。代码如下: Private Sub Command1_Click() CommonDialog1.CancelError = True    ' 设置“取消”为 True On Error GoTo ErrHandler CommonDialog1.HelpCommand = cdlHelpForceFile    '设置HelpCommand属性 CommonDialog1.HelpFile = "c:\windows\system32\winabc.hlp"    '指定帮助文件 CommonDialog1.ShowHelp Exit Sub ErrHandler:    ' 按下“取消”按钮 Exit Sub End Sub 10.1.2自定义对话框 1.自定义对话框的种类与建立 表10.1.5 自定义对话框属性设置 通过添加窗体的方法在【添加窗体】对话框中选择【对话框】来新建一个标准对话框;然后根据需要,用户完全可以自行设计对话框的外观和功能,这就是自定义对话框。 一个自定义对话框实际上就是一个窗体,它与一般窗体只有细微差别。从外观上看,对话框没有最大化和最小化按钮,所以它不能改变大小。用户可以根据实际需要或自己的喜好,综合利用系统提供的各种控件,设计出自己需要的对话框。 对话框属性设置如表10.1.5所示。 2. 对话框的显示与卸载 对话框分成两种类型:模式的和无模式的。 (1)模式对话框 模式对话框是指在继续操作应用程序的其他部分之前,对话框必须被关闭(隐藏或卸载)。例如,如果一个对话框,在可以切换到其它窗体或对话框之前, 要求 对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗 先单击“确定”或“取消”,则它就是模式的。Visual Basic中的通用对话框、“关于”对话框就是模式的;显示重要消息的对话框总应当是模式的,这就是说,在继续下去之前,总是要求用户应当先关上对话框或者对它的消息作出响应。 (2)无模式对话框 无模式对话框允许在对话框与其他窗体之间转移焦点而不用关闭对话框。当对话框正在显示时,可以在当前应用程序的其他地方继续工作。Visual Basic 中“编辑”菜单中的“查找”对话框就是无模式的。无模式对话框常用于显示频繁使用的命令与信息。 (3)对话框显示模式的设置 设计好自定义的对话框后,就要考虑如何显示对话框。显示对话框采用Show方法。 假设对话框名称为Dialog1,将该对话框显示为模式的Show方法格式为: Dialog1. Show vbModal 而将该对话框显示为无模式的Show方法格式为: Dialog1. Show (4)对话框的卸载或隐藏 要卸载或隐藏自定义对话框,可以在对话框的“确定”或“取消”命令按钮的单击事件中,使用Unload方法或Hide方法。隐藏和卸载的区别在于,隐藏只是在界面上不显示,应用程序中还保留本对话框;而卸载则是将对话框彻底删除。 10.2 菜单设计 菜单是可视化编程最重要的组成部分之一。 通过菜单,可以快速进入用户需要的模块。在窗口环境下,绝大多数应用程序使用菜单界面进行各种操作。菜单提供了人机对话界面,方便使用者选择应用系统的各种功能。另外,通过菜单可以管理应用系统,控制应用程序各种功能模块的运行。在Visual Basic 6.0中,可以直接通过菜单编辑器设计菜单。 10.2.1菜单简介 菜单分为下拉式菜单和弹出式菜单。下拉式菜单如图10.2.1所示;弹出式菜单如图10.2.2所示。 下拉式菜单的基本结构包括菜单栏、主菜单、一级菜单和子菜单。菜单中包含的界面元素有菜单项、快捷键、访问键、分隔条、选中提示、子菜单提示、 对话框提示。 VB的子菜单最多只允许有6层树形目录,即只能有5级子菜单。 一级菜单和子菜单的基本元素就是菜单项。在VB中,每个菜单项代表着一条命令或子菜单,就是一个控件。与其他控件一样,它具有定义外观和行为的属性。在设计或运行时可设置Caption属性、Enabled属性和Checked属性等。菜单控件只能识别一个事件,即Click事件,当用鼠标或键盘选中某个菜单对象时,将引发该事件。 10.2.2菜单编辑器 为了能为窗体设计菜单,可以用以下4种方法的其中一种进入“菜单编辑器”。 ①点击【工具】菜单,在弹出的菜单中选择【菜单编辑器】选项,便可进入“菜单编辑器”。 ②单击集成环境中的标准工具栏上的【菜单编辑器】按钮,也可进入“菜单编辑器”。 ③使用热键Ctrl+E可以调出“菜单编辑器”。 ④在要建立菜单的窗体上单击鼠标右键,在弹出的菜单中单击选择“菜单编辑器”菜单项。 注意:只有当某个窗体为活动窗体时,才能用上述方法打开有关该窗体的菜单编辑器窗口。 【菜单编辑器】窗口可以分成三部分,即数据区、编辑区和菜单列表区,如图10.2.3所示。 1.数据区 数据区用于输入或修改菜单项,设置菜单项的属性。各属性的作用如下所述。 (1)标题 即菜单控件的Caption属性,用于输入要在菜单项中显示的文字,如“文件”、“编辑”、“视图”等。如果想在菜单中建立分隔条,则应在标题框中键入一个减号“-”。 如果想给菜单项定义一个访问键,则可以在一个字母前插入“&”符号,在运行时该字母会带有下划线,同时按Alt键和该字母就可以打开主菜单标题的子菜单。对于己经打开的子菜单,直接按该字母键就可以访问该菜单项或命令。 (2)名称 相当于设置菜单控件的名称(Name)属性,是代码中访问菜单项的唯一标识。菜单或菜单项名称的命名最好加上它的父菜单的名称信息,并且还与菜单的功能有一定的联系。如编辑菜单下的剪切、拷贝、粘贴的菜单项名称分别为mnuEditCut,mnuEditCopy,mnuEditPaste。 所有菜单项都必须输入名称,否则界面将出现“Menu控件必须有一个名称”的提示。 (3)索引 即菜单控件的Index属性。可将若干个菜单控件定义成一个控件数组。Index属性用于确定相应菜单控件在数组中的位置,该值不影响菜单控件的显示位置。 (4)快捷键 即菜单控件的Shortcut属性。用于为当前的菜单项指定一个快捷键,快捷键从下拉列表中选择,如Ctrl+A,Shift+F9等。注意不能给顶级菜单加快捷键。 (5)帮助上下文ID 即菜单控件的HelpContextID属性。在HelpFile属性指定的帮助文件中用该数值查找适当的帮助主题。 (6)协调位置 即菜单控件的NegotiatePosition属性。该属性决定了是否及如何在窗体中显示菜单,该属性有以下4个选项。 0,None——默认值,当对象活动时,菜单栏上不显示顶级菜单; 1,Left——当对象活动时,顶级菜单显示在菜单栏的左端; 2,Middle——当对象活动时,顶级菜单显示在菜单栏的中间; 3,Right——当对象活动时,顶级菜单显示在菜单栏的右端。 (7)复选 即菜单控件的Checked 属性,取值可以是True或False。该属性用来设置菜单项的左边是否带复选标记“√”。在菜单编辑器中,其默认值为FaIse。当该属性值为True时,在下拉菜单项前面显示一个复选标志。若要求复选标志在点击菜单项时交替出现,则在设计时除设置该菜单项具有复选功能外,还必须在相应事件过程中写入如下代码: Private Sub 菜单名称_Click() 菜单名称.Checked=Not 菜单名称.Checked End (8)有效 即菜单控件的Enabled属性,取值可以是True或False。在菜单编辑器中, 其默认值为True,该属性用来决定是否让菜单项对事件做出响应。设置为False时,则相应的菜单项呈灰色显示。 (9)可见 即菜单控件的Visible属性,取值可以是True或False,默认值为True。该属性用来决定菜单项是否显示。设置为False时,则相应的菜单项不显示。 (10)显示窗口列表 即菜单控件的WindowList属性。在MDI应用程序中,该设置用于确定菜单控件是否包含一个当前打开的MDI子窗体的列表。 2.编辑区 编辑区共有7个按钮,用于对输入的菜单项进行简单的编辑操作。 ——单击该按钮,把在菜单列表区中选定的菜单向上移一个等级。 ——单击该按钮,把在菜单列表区中选定的菜单向下移一个等级,显示一个内缩符号(…)。 ——单击该按钮,把在菜单列表区中选定的菜单项在同级菜单内上移动一个位置。 ——单击该按钮,把在菜单列表区中选定的菜单项在同级菜单内下移动一个位置。 【下一个】按钮——开始一个新的菜单项。 【插入】按钮——在菜单列表区中的当前选定项上方插入一个新的菜单项。 【删除】按钮——删除当前在菜单列表区中选定的菜单项。 3.菜单项列表区 菜单项列表区显示了菜单项的分级列表。缩进子菜单项以指出它们的分级位置或等级。 在菜单编辑器中完成了各菜单项的设置之后,单击【确定】按钮即可关闭菜单编辑器。这时在窗体的顶部就可以看到设计的菜单结构,以及下拉菜单。但在设计时,单击菜单项不是执行菜单项功能,而是打开菜单项单击事件过程的代码窗口。只有在该代码窗口中写上完成相应功能的代码后,才能在运行时通过单击菜单项执行相应的功能。 如果在菜单编辑器中单击【取消】按钮,则关闭菜单编辑器,取消所有的修改。 10.2.3菜单的设计 现在,我们用菜单编辑器来建一个简单的菜单并实现其功能。 例10.2.1 利用菜单确定标签上显示的文字的字体、字号、效果等。 首先,在窗体上添加一个用于显示文字信息的标签Label1,然后我们来建立一个下拉式菜单。 表10.2.1 菜单顶的设置 启动菜单编辑器,按照表10.2.1来设置菜单项,建立菜单,建立的菜单界面如图10.2.4所示。 接着我们来设计具体的功能。 我们要知道菜单的每个菜单项(主菜单项、子菜单项)都可看做是一个对象,其属性已经在菜单编辑器中进行了设置。在菜单的Click事件过程中可以编写菜单运行时所要完成功能的程序代码。其设计的规范、命令、语句和函数的引用方法与其它控件的事件过程完全相同。菜单项的Click事件可以同时被下面两种操作触发: ①用键盘操作菜单,当在选择的菜单项上按下Enter键时。 ②当用户使用快捷键或访问键选择菜单项时。 具体功能实现代码如下: Private Sub Form_Load() Label1.FontSize = 24    ' 设置字号初始值为24 Label1.Caption = "Visual Basic菜单"    ' 设置标签上显示的字符 End Sub Private Sub S11_Click(Index As Integer)    ' 设置字号菜单下各项对应值 Label1.Caption = val(S11(Index).Caption) End Sub Private Sub F11_Click(Index As Integer)    ' 设置字体菜单下各项对应字体 Label1.FontName = F11(Index).Caption End Sub Private Sub A11_Click(Index As Integer)    ' 设置效果菜单下各项对应效果 Select Case Index Case 0 Label1.FontBold = True Case 1 Label1.FontItalic = True Case 2 Label1.FontUnderline = True End Select End Sub Private Sub E1_Click() End End Sub 10.2.4 弹出式菜单 弹出式菜单能够以更加灵活的方式为用户提供方便的操作,它独立于菜单栏,直接显示在窗体上。 弹出式菜单能根据用户当前单击鼠标的位置,动态地调整菜单项的显示位置及显示内 容,并提供相应的操作。因此,弹出式菜单又称为“上下文菜单”或“快捷菜单”。通常,弹出式菜单可以通过单击鼠标右键来打开,所以也称“右键菜单”。 弹出式菜单一般用来处理与窗体特别区域相关的操作,或用于处理对特别控件的属性 与应用的操作。例如,我们在Windows的【开始】处单击鼠标右键会激活与它关联的弹出菜单,在Windows桌面的空白处单击鼠标的右键,就会激活与系统桌面关联的弹出菜单,等等。在Windows系统中弹出菜单的应用是非常普遍的。 1.弹出式菜单的设计 为某对象(控件)设计弹出式菜单的步骤如下。 ①在菜单编辑器中按设计下拉式菜单的方法设计弹出式菜单。 ②将要作为弹出式菜单的顶级菜单设置为不可见。 ③在对象的MouseDown或MouseUP事件过程中编写代码,用PopupMenu方法调用弹出式菜单。 2.弹出式菜单的调用 在VB中,使用PopupMenu方法来显示弹出菜单。PopupMenu方法的语法为: [<对象>.] PopupMenu <菜单名>[,flags [,x[, y[, boldcommand]]]] 功能:在MDI窗体或窗体对象上的当前鼠标位置或指定的坐标位置显示弹出式菜单。其中: <对象>——指菜单所在的位置,如果省略,则默认为是当前窗体。 <菜单名>——在菜单设计器中设计的菜单项〈至少有一个子菜单)的名称。 flags——可选项,一个用于指定弹出式菜单的位置和行为的数值或常量,其参数说明如表10.2.1所示。 Boldcommand参数——指定需要加粗显示的菜单项,注意只能有一个菜单项加粗显示。 10.2.5  动态定制菜单 动态菜单是指运行时,根据用户的选择来改变菜单的状态,增加或减少菜单项。 1.运行时改变菜单状态 在菜单运行中对菜单项的属性进行设置,可以改变运行时菜单的状态。下面就如何动态地设置菜单的属性及菜单属性的应用技巧做详细的介绍。 (1)使菜单项有效或无效 每个菜单都是窗体中的一个控件对象,所有的菜单控件都具有Enabled属性,当该属性设为False时,该菜单项将变为无效或被禁用。但是,被禁用的菜单项并没有从菜单上消失,只是变为灰色,用户不能通过操作使该菜单项对应的命令或过程得到执行,而且该菜单项的快捷键无效。 在应用程序中使【编辑】菜单上的【粘贴】菜单项无效的命令: mnuEditPaste.Enabled=False 如果把主菜单上的某个菜单项变为无效,则该菜单项下的整个菜单均无效。因为不单 击上一级菜单标题,就不能访问它下一级的任何菜单项。 可以根据程序运行的进程和正在进行的操作,有选择地使菜单系统中的某些菜单项有效,或使某些菜单项无效,从而保证系统的安全性,减少不必要的冲突,也可为程序设计省去不少麻烦。 (2)菜单控件复选标志的应用 菜单项控件的“Checked”属性可以把一个复选标志显示在菜单上,以表示该菜单项是否被选中,以及某些窗口或工具栏等所处的状态是打开还是关闭。这类应用一般都可交替地为菜单项增加和删除复选标志。 例10.2.2 窗体上工具栏的控制:当工具栏在窗体上显示时,则在“工具栏”菜单项的左边出现一个复选标志“√”;如果这时选择该“工具栏”菜单项,则工具栏将被隐藏,该菜单项左边的复选标志同时消失。代码如下: Private Sub rnnuOptionsToolbar_Click() Toolbarl.Visible = Not Toolbarl.Visible    '改变工具栏控件Toolbarl的Visible 属性 '由True变以False,或由False变为True mnuOptionsToolbar.Checked = Toolbarl.Visible    '根据Visible属性设置有无 '复选标志 End Sub 一般情况下工具栏与窗体同时加载,当工具栏Toolbar控件的Visible属性设置为True时,“工具栏”菜单项的“Checked”属性也设置为True。在菜单启动时,“工具栏”菜单项就带有复选标志了。此复选标志不是固定不变的,它会根据工具栏的状态在程序运行时动态地改变。 2.动态增减菜单 运行时菜单项的增减就是在菜单运行中向主菜单或子菜单中增加菜单项,或去除不必要的菜单项。有两种方式可以实现此功能。 (1)改变菜单项的Visible属性 在菜单设计之初,也就是在“菜单编辑器”完成整个菜单结构的设计。设计中,把暂时不用的菜单项的Visible属性设置为False。这样,这些菜单项将在窗体启动后,与其他菜单项一起被加载,但不会在菜单系统中出现。只有当需要时,把它们的Visible属性设置为True,它们才会出现在正在运行的菜单系统之中。在设计时需要明确以下几个问题。 ①当在主菜单上增加一个菜单项时,它的位置是在设计时就已安排好的。例如,【编辑】菜单项设计是在【窗口】菜单项之前,但开始时,【编辑】菜单的Visible属性为False,则它没有出现在运行的菜单中。若此时将它的Visible属性改变为True,则它会立刻出现在当前运行的菜单中,并且位于【窗口】菜单项之前,而【窗口】菜单项以后的所有菜单项都向右移动一位。如果由于菜单项的增加,菜单栏的长度不够时,菜单会自动换行。 ②与主菜单类似,若在子菜单上增加一个菜单项时,它在子菜单中的位置也是在设计时安排好的,它的插入使原有菜单项向下移动。 ③若把菜单中的某个菜单项删除,则子菜单中的其余菜单项会自动填补空出的空间;如果被删除的是主菜单中的菜单项,则主菜单上其余的菜单项会自动左移以填补该空间。 (2)用菜单控件数组 利用菜单控件数组,可以在代码中运用Load方法创建一个或若干个新的菜单项,也可以用UnLoad方法删除菜单项。如word的【文件】菜单就是利用了菜单控件数组来存储新近打开的文件清单。 通常也是在菜单编辑器中建立菜单控件数组,具体步骤如下。 ①选取要创建菜单的窗体。 ②在【工具】菜单上,选取【菜单编辑器】菜单项,或单击工具栏上的【菜单编辑器】按钮,激活“菜单编辑器”。 ③创建主菜单项。在“菜单编辑器”的【标题】和【名称】文本框中,分别键入所建菜单的标题的文本和名称,并保持其菜单的【索引】框是空的。 ④单击右箭头按钮,键入下一个缩进级(一级子菜单),继续通过设置“标题”和“名称”来创建菜单数组中第1个元素的菜单项,并且把该菜单项的“索引”设置为0。 ⑤重复步骤④,在同一缩进级上创建多菜单项,其名称与上一个菜单项的名称相同,但要把它的“索引”设置为1。依次增加索引,则建立起菜单控件数组。 要注意建立菜单控件数组有以下基本要求: ①菜单控件数组的各元素在菜单控件列表框中必须是连续的,而且必须在同一缩进级上,不同级别的菜单项(例如主菜单和其子菜单)不能形成一个菜单控件数组,不同菜单下的子菜单项更不能构成于同一菜单数组中。 ②创建菜单控件数组时,要把在菜单中出现的分隔条也包括进去。 ③菜单控件数组元素必须有索引值,不能为空。因为与VB其他控件数组不同, Menu控件数组要求在创建时指定索引值,VB不为Menu控件数组项提供默认的Index属性值。 ④菜单控件数组索引必须以升序排列,但不一定连续。在为索引赋值之前,必须明确已经使用了哪些索引值。 建立菜单控件数组后,数组元素所对应的每个菜单项的属性可在设计时进行设置,也可以在运行时改变。设计时,可在“菜单编辑器”中进行设置。动态菜单数组技术的特点是,所添加或删除的菜单项(包括这些菜单项的属性设置)都是在菜单运行中进行的,并且一个菜单数组中的菜单项使用的是一样的程序代码,完成相同的任务。典型的例子就是前面提到的【文件】菜单下自动添加并改变菜单项,用以保存最近几次调用过的文件名。 10.3多重窗体 对于较为简单的应用程序,一个窗体就足够了。对于复杂的应用程序,往往需要通过多重窗体来实现。每一个窗体可以有不同的界面和程序代码,以完成不同的功能。如有的窗体用来输入数据,有的窗体用来显示结果等等。 10.3.1添加窗体 用户可以用以下三种方法打开“添加窗体”对话框: ①选择【工程】菜单下的“添加窗体”菜单项; ②点击工具条上的“添加窗体”按钮(注意不是“添加工程”按钮); ③在工具资源管理器上点击右键,在浮动菜单上选择“添加”下的“添加窗体”菜单项。 在“添加窗体”对话框中点击“打开”按钮,就会出现一个新的窗体,同时工程资源管理器的“窗体”中也添加了一个新窗体。每一个窗体都有一个.Frm文件与之对应。注意每个窗体应具有不同的Name属性。 10.3.2 窗体的加载、显示、隐藏与卸载 在多窗体程序设计中,经常需要打开、关闭、隐藏或显示指定的窗体。这可以通过相应的语句和方法来实现。 1.Load语句 Load语句的作用是将一个窗体装入内存,但并不显示窗体,其语法格式为: Load 窗体名称 2.Unload语句 Unload语句的功能与Load语句相反,是将窗体从内存中删除。Unload语句的语法格式为: Unload 窗体名称 3.Show方法 语法格式:[窗体名称.]Show [模式] 此方法具有加载和显示两项功能。如果窗体已经显示,则Show方法什么都不做。 窗体名称是可选的,如果省略窗体名称,则与活动窗体模块关联的窗体默认为当前窗体。 模式也是可选的,它是一个整数,用以决定窗体是模式还是无模式。如果模式为0,显示窗体之后,则继续执行后面的语句,这时显示的窗体是无模式的。无模式的窗体不会影响用户对同一程序中其他窗体的操作。如果模式为1,则显示窗体并暂停执行后面的语句,这时窗体是模式的。模式的窗体阻止用户操作本应用程序的其他窗体。只有隐藏或卸载了模式窗体之后,才可以继续执行Show方法之后的语句,才可以使用其他的窗体。 4.Hide方法 用以隐藏窗体对象,但并不能从内存中将其卸载。Hide方法的语法格式为: [窗体名称.]Hide 隐藏窗体时,它就从屏幕上消失,并将其Visible 属性设置为False。用户将无法访问隐藏窗体上的控件,但是对于运行中的Visual Basic应用程序,或对于通过DDE与该应用程序通讯的进程及对于Timer 控件的事件,隐藏窗体的控件仍然是可用的。 窗体被隐藏时,用户只有等到被隐藏窗体的事件过程的全部代码执行完后,才能够与该应用程序交互。 调用Hide方法时,如果窗体还没有加载,那么Hide方法将加载该窗体但不显示它。 10.3.3 设置启动窗体 在具有多个窗体的应用程序中,各个窗体之间是并列关系。程序运行时,首先执行的对象默认为第一个创建的窗口Form1,称为启动对象。根据需要可以指定其他窗体或Main子过程为启动对象。 单击【工程】,在下拉式菜单里单击【工程1属性】即可打开工程属性对话框进行设置。如图10.3.1所示。 10.4多文档界面 多文档界面(MDI,multiple document interface)是一种典型的Windows应用程序结构。多文档界面由一个父窗体(简称MDI窗体)和一个或多个子窗体组成。MDI窗体作为子窗体的容器,子窗体包含在父窗体之内,用来显示各自的文档,所有的子窗体都具有相同的功能。例如,我们非常熟悉的Word、Excel等都是多文档界面,它们允许同时显示多个文档,每个文档都显示在自己的窗口中。按照是否包含有能在窗口或文档间进行切换的子菜单的Windows菜单项,就能识别出MDI应用程序。 10.4.1 MDI主窗体和MDI子窗体 MDI应用程序由菜单、工具栏、子窗口区和状态条组成,允许用户同时显示多个文档,每个文档都显示在它自己的窗口中。文档或子窗口被包含在父窗口中,父窗口为应用程序中所有子窗口提供的工作空间。例如,Excel允许创建并显示不同样式的多文档窗口。每个子窗口都被限制在Excel父窗口的区域之内。当最小化Excel时,所有的文档窗口也被最小化,只有父窗口的图标显示在任务栏中。 子窗体就是指多文档界面(MDI)应用程序中所包含的在MDI主窗体中的一个窗体。为了创建一个子窗体,应将其MDIChild属性值设置为True。一个应用程序可以包含许多相似或者不同样式的MDI子窗体。运行时,子窗体会显示在MDI主窗体工作空间之内(其区域在父窗体边框以内,标题与菜单栏之下)。当子窗体最小化时,它的图标会显示在MDI窗体的工作空间之内,而不是在任务栏中,如图10.4.1所示。 要注意的是一个应用程序也可以包括标准的,且不是包含在MDI窗体之内的非MDI窗体。MDI应用程序中,标准窗体的典型用法是显示模式的对话框。 MDI窗体与具有一个限制条件的普通窗体相似。除非控件具有Align属性(如PictureBox控件)或者具有不可见界面(如Timer控件),否则不能将控件直接放置在MDI窗体上。 使用下列步骤来创建MDI窗体及其子窗体。 ①创建MDI窗体。从【工程】菜单中选取【添加MDI窗体】命令。 注意:一个应用程序只能有一个MDI窗体。如果工程已经有了一个MDI窗体,则该【工程】菜单上的【添加MDI窗体】命令就不可使用。 ②创建应用程序的子窗体。要创建一个MDI子窗体,应先创建一个新的普通窗体(或者打开一个存在的普通窗体) ,然后把它的MDIChild属性设置为True。 MDIChild属性返回或设置一个值,它指示在MDI窗体内部显示的一个窗体是否被作为MDI子窗体。它在运行时是只读的。 MDIChild属性的设置值为True,则窗体是一个MDI子窗体并且被显示在父MDI窗体内;若将其设置为False(默认值),则窗体不是一个MDI子窗体。 当建立一个多文档(MDI)应用程序时要使用MDIChild属性。在运行时,该属性被设置为True的窗体会被显示在MDI窗体内。一个MDI子窗体能够被最大化、最小化和移动,这些均在父MDI窗体内部进行。 为了使MDI子窗体起作用,要注意以下事项: ①在设计时,一个MDI子窗体将像其他窗体一样显示,因为该窗体仅在运行时才被显示在父窗体内部。在【工程】窗口中一个MDI子窗体的图标与别的类型的窗体的图标是不同的。 ②MDI子窗体不能是模式的。 ③MDI子窗体的初始化大小和位置被Windows操作环境控制,除非在 Load事件过程中设置它们。 ④如果MDI子窗体在其父窗体装入之前被引用,则其父MDI窗体将被自动装入;如果父MDI窗体在MDI子窗体装入前被引用,则子窗体不能被载入。 注意:不管如何设置BorderStyle,ControlBox,MinButton和MaxButton的属性值,所有MDI子窗体都有可调整大小的边框、控制菜单框,以及最小化和最大化按钮。对MDIForm对象的任何引用,包括读和属性设置,都将导致该窗体被装入并成为可见的。 在运行时,MDI窗体及其所有的子窗体有以下的特征: ①所有子窗体均显示在MDI窗体的工作空间内。像其他的窗体一样,用户能移动子窗体,并改变其大小,但是它们都被限制于这一工作空间内。 ②当最小化一个子窗体时,它的图标将显示于MDI窗体上而不是在任务栏中。当最小化MDI窗体时,此MDI窗体及其所有子窗体将由一个图标来代表。当还原MDI窗体时, MDI窗体及其所有子窗体将按最小化之前的状态显示出来。 ③当最大化一个子窗体时,它的标题会与MDI窗体的标题组合在一起,并显示于MDI 窗体的标题栏上,如图10.4.2所示。 ④通过设定AutoShowChildren属性,子窗体可以在窗体加载时自动显示(True)或自动隐藏(False)。 ⑤活动子窗体的菜单将显示在MDI窗体的菜单栏中,而不是显示在子窗体中。 10.4.2 MDI界面中的常见操作 在设计时,子窗体没有被限制在MDI窗体区域之内,这时可以为其添加控件、设置属性、编写代码,以及设计子窗体的功能,其操作与在其他Visual Basic窗体中的做法相同。 通过查看MDIChild属性或者检查工程资源管理器,可以确定窗体是否是一个MDI子 窗体。如果该窗体的MDIChild属性设置为True,则它是一个子窗体。Visual Basic在“工程资源管理器”中为MDI窗体与MDI子窗体显示了特定的图标,如图10.4.3所示。 1.使用MDI窗体及其子窗体 当MDI应用程序在一次会话中要打开、保存和关闭几个子窗体时,应当能够引用活动窗体并保持关于子窗体的状态信息。这个主题描述了一些用来指定活动子窗体或控件、加载和卸载MDI窗体及其子窗体,以及保持子窗体的状态信息的编码技巧。 2.指定活动子窗体或控件 有时要提供一条用于对当前活动子窗体上具有焦点的控件进行操作的命令。例如,假设从子窗体的文本框中把所选文本复制到剪贴板上。在Mdinote.vbp应用程序中,【编辑】菜单上的【复制】项的Click事件将会调用EditCopyProc,它就是把选定的文本复制到剪贴板上的过程。 由于应用程序可以有同一子窗体的许多实例,EditCopyProc需要知道使用的是哪一个窗体。为了指定这一窗体,使用MDI窗体的ActiveForm属性可以返回具有焦点的或者最后被激活的子窗体。 注意:当访问ActiveForm属性时,至少应有一个MDI子窗体被加载或该窗体为可见,否则会返回一个错误。 当一个窗体中有几个控件时,还需要指定哪个控件是活动的。像ActiveForm属性一样ActiveControl属性能返回活动子窗体上具有焦点的控件。例如,从子窗体菜单、MDI窗体菜单或者是工具栏按钮上可对它进行调用: Private Sub EditCopyProc () ClipBoard.SetText frmMDI.ActiveFrom.ActiveControl.SelText    '将选定文本复制 '到剪贴板上 End Sub 假如正在编写被多个窗体实例调用的代码,可以不用窗体标识符访问窗体的控件或属性,这样可以避免代码总是影响当前窗体。例如,用Textl.Height引用Form1上文本框的高度,而不是使用Forml.Textl.Height。 在代码中指定当前窗体的另一种方法,是用Me关键字来引用当前正在运行的窗体。当需要把当前窗体实例的引用参数传递给过程时,这个关键字很有用。 3.加载MDI窗体及其子窗体 加载子窗体时,其父窗体(MDI窗体)会自动加载并显示。而加载MDI窗体时,其子窗体并不会自动加载。 在多文档记事本示例中,子窗体是默认的启动窗体,因而在程序运行时,子窗体和MDI窗体两者都会加载。如果在多文档记事本应用程序中改变启动窗体为frmMDI,然后运行应用程序,则只有MDI窗体被加载。当从【文件】菜单中选取【新建】命令时,才会加载第一个子窗体。 AutoShowChildren属性可用来加载隐藏状态的MDI子窗口。当AutoShowChildren属性为True(默认值)时, MDI子窗体会在加载时自动显示;若属性为False,则MDI子窗体在加载时不会自动显示。可以用AutoShowChildren属性加载MDI子窗体,并保持其隐藏状态直到用Show方法将它显示出来。这就允许子窗体在可见之前更新标题、位置和菜单等各种细节。 不能把MDI子窗体或者MDI窗体显示为模式窗体(用带vbModal参数的Show方法)。如果想在MDI应用程序中使用模式对话框,可使用MDIChild属性为False的窗体。 4.设置子窗体的大小和位置 如果MDI子窗体具有大小可变的边框(即BorderStyle=2),则在其装载时,Windows将决定其初始的高度、宽度和位置。边框大小可变的子窗体,其初始大小与位置取决于MDI窗体的大小,而不是设计时子窗体的大小。当MDI子窗体的边框大小不可变(即BorderStyle = 0,1或3)时,则它将用设计时的Height和Width属性载入。 如果设置AutoShowChildren为False,则在载入MDI子窗体以后,把它设为可见状态之前,其位置是可以改变的。 5.维护子窗体的状态信息 在用户决定退出MDI应用程序时,必须有保存信息的机会。为了使其能够实现保存功能,应用程序必须随时确定自上次保存后的子窗体中的数据是否有改变。 通过在每个子窗体中声明一个公用变量来实现此功能。例如,可以在子窗体的声明部分声明一个变量: Public boolDirty As Boolean Textl中的文本每次改变时,子窗体文本框的Change事件就会将boolDirty设置为True。可添加如下代码以指示自上次保存后Text 1的内容已经改变。 Private Sub Text1_Change () boolDirty = True End Sub 反之,用户每次保存子窗体的内容时,文本框的Change事件就会将boolDirty设置为False,以指示Textl的内容不再需要保存。在下列代码中,假设有一个叫做“保存” (mnuFileSave)的菜单命令和一个用来保存文本框内容的名为FileSave的过程。 Sub mnuFileSave_Click () FileSave    '保存Textl的内容 boolDirty=False    '设置状态变量 End Sub 6.用Query Unload卸载MDIl窗体 当用户决定退出应用程序时,boolDirty标志就很有用了。当用户从MDI窗体的【控制】菜单中选取【关闭】选项,或者从提供的菜单项如【文件】菜单上选取【退出】命令时,上述情况就会出现。如果用户使用MDI窗体的【控制】菜单来关闭应用程序,VB将试图卸载MDI窗体。 当MDI窗体被卸载时,则首先触发MDI窗体的QueryUnload事件,再依次触发每个打开的子窗体的QueryUnload事件。如果在这些QueryUnload事件过程中没有代码,则触发Unload事件,这时每一个子窗体都会被卸载,最后卸载MDI窗体。 因Query Unload事件在窗体卸载之前被触发,故在窗体卸载前可以在这个事件中进行保存。下述代码使用boolDirty标志来决定是否要提醒用户在子窗体卸载之前进行保存。 Private Sub mnuFExit_Click() '当用户在MDI应用程序中选取“文件提出”命令时,卸载 'MDI窗体,为每个打开的子窗体调用Query Unload事件 Unload frmMDI End End Sub Private Sub Form_QueryUnload(Cancel As Integer,_ UnloadMode As Integer) if boolDirty Then '调用例程来询问用户且在必要时保存文件 FileSave End If End Sub 注意:可以在工程的任何地方访问公共窗体变量值。假定这个代码有一个名叫FileSave的过程,它会将Text 1的内容保存到一个文件中。 7. 创建MDI应用程序的菜单 在MDI应用程序中,每一个子窗体的菜单都显示在MDI窗体上。当子窗体有焦点时,该子窗体的菜单(若有)就代替菜单栏上的MDI窗体的菜单。如果没有可见的子窗体,或者如果带有焦点的子窗体没有菜单,则显示MDI窗体的菜单。 MDI应用程序使用几套菜单的情况很普遍。当打开一个文档时,应用程序显示与该类文档相关的菜单。通常情况下,当没有可见子窗体时,程序会显示一个不同的菜单。例如,当没有文件打开时,Microsoft Excel只显示【文件】与【帮助】菜单。当用户打开一个文件时,其他菜单如【编辑】、【视图】、【插入】、【格式】等就会显示出来。 通过给MDI窗体和子窗体添加菜单控件可以创建菜单。管理MDI应用程序中的菜单的一个方法,就是把希望在任何时候都显示的菜单控件放在MDI窗体上(即使没有子窗体可见时)。如图10.4.4所示。 把应用于子窗体的菜单控件放置到子窗体中。在运行时,只要有一个子窗体可见,这些菜单标题就会显示在MDI窗体的菜单栏中。
本文档为【10章主讲(排)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_321635
暂无简介~
格式:doc
大小:93KB
软件:Word
页数:0
分类:互联网
上传时间:2020-03-09
浏览量:2