370 likes | 557 Views
第七章 创建用户界面. 7.1 对话框的分类与特点. 7.2 菜单设计. 7.3 多重窗体设计. 7.4 多文档界面设计. 7.1.1 对话框的分类与特点. 对话框( DialogBox )是程序与用户进行交互的主要途径。它既可以用于输入信息,也可以用来显示信息。 在 VB 应用程序中,可以使用预定义对话框、用户自定义对话框和通用对话框三种对话框。 对话框是一种特殊的窗体,它具有以下特点: ( 1 )一般不允许用户改变对话框的大小,边框固定。
E N D
第七章 创建用户界面 7.1 对话框的分类与特点 7.2 菜单设计 7.3 多重窗体设计 7.4 多文档界面设计
7.1.1 对话框的分类与特点 对话框(DialogBox)是程序与用户进行交互的主要途径。它既可以用于输入信息,也可以用来显示信息。 在VB应用程序中,可以使用预定义对话框、用户自定义对话框和通用对话框三种对话框。 对话框是一种特殊的窗体,它具有以下特点: (1)一般不允许用户改变对话框的大小,边框固定。 (2)为强调对话框自身的交互性,对话框的退出只能通过其内部的某个按钮控制,而不能由其它窗体所控制。 (3)为避免对话框被意外扩大或缩小成图标,在对话框中不允许有最大化按钮(Max Button)和最小化按钮(Min Button)。 (4)对话框不是应用程序的主要用户界面,而只是一种临时的用户界面,仅在适当条件下弹出,使用后即关闭。
7.1.1 对话框的分类与特点 1.预定义的对话框 • 预定义对话框是系统定义的对话框,可以通过函数调用直接显示,主要有输入框与消息框两种。可以通过在第三章介绍的InputBox和MsgBox函数调用预定义的输入框与消息框。
2.用户自定义对话框 • 自定义对话框是用户所创建的含有控件的窗体。这些控件包含命令按钮、单选框、复选框和文本框等,它们可以为应用程序接收或输出信息。作为对话框的窗体与一般的窗体在外观上是有所区别的,对话框没有控制菜单框及最大化最小化按钮,不能改变它的大小,所以对对话框的窗体应该做如表7.1所示的属性设置。
3.通用对话框 • 使用单个的通用对话框控件,可以以文件打开、另存为、颜色、字体和打印等对话框的形式显示。这些对话框仅用于返回信息,不能真正实现文件打开、存储、颜色设置、字体设置和打印等操作,如果想要实现这些功能必须通过编程解决。 • CommonDialog控件不是标准控件,而是ActiveX外部控件。可以单击菜单“工程->部件”或右击工具箱窗口,在弹出的快捷菜单中选择“部件”,打开“部件”对话框,在“控件”选项卡中,选择Microsoft Common Dialog Control 6.0选项,点击“确定”按钮就可将CommonDialog控件添加到工具箱中。
7.1.2通用对话框的常用属性和方法 1.Action属性和Show方法组 • 在设计状态,CommonDialog控件以图表的形式显示在窗体上,其大小不能改变,在程序运行时,控件本身被隐藏。有两种方法打开对话框:(1) 对其Action属性赋值;(2) 使用Show方法组。
7.1.2通用对话框的常用属性和方法 2.CancelError属性 • 通用对话框内有一个“取消”按钮,用于取消当前操作。CancelError属性默认值为False。其值设为True 时,若用户单击“取消”按钮关闭对话框,将当作出错处理。如果在程序开头加上On Error GoTo ExitN,在用户“取消”按钮时,程序将转到标号ExitN去进行处理。 3.DialogTitle属性 • 返回或设置对话框的标题,如果要在程序当中使用,则需要放在给Action属性赋值的语句之前。
7.1.3 “打开/另存为”对话框 “打开/另存为”对话框又称为“文件”对话框,具有名副其实的文件管理功能,如图7.5所示。其具有两种模式:打开文件和保存文件。“打开”与“另存为”对话框都可以指定驱动器、目录、文件名、文件扩展名、外观类似,只是标题不同。
1.FileName 属性 该属性值为字符串,用于设置或返回用户所选的文件名(包括路径)。 2.FileTitle属性 该属性的功能与FileName非常相似,属性值也是字符串,用于设置或返回用户所要打开的文件名(不包括路径)。 3.Filter属性 • 该属性是字符串类型,返回或设置用来筛选文件的过滤器,对话框将只列出该属性所指定类型的文件。其格式为: 文件说明 | 文件类型[ …| 文件说明| 文件类型] • 注意:每一个文件过滤器由一组“文件说明 | 文件类型”构成,其中“文件说明”是过滤器的标题,真正用于筛选文件的是“文件类型”部分。例如,两组文件过滤器:CommonDialog1.Filter=”All files | *.* | Bitmaps |*.bmp”
4.FilterIndex属性 该属性用来设置当前的文件过滤器,属性值为整数,自0开始。例如: CommonDialog1.Fillter=”All files | *.* | Bitmaps |*.bmp” CommonDialog1.FilterIndex=1 则此时,显示在组合框中的是“Bitmaps”类型。 5.InitDir属性 该属性用来制定打开对话框中的初始目录。若显示当前目录,则该属性不需要设置。
6.Flags属性 该属性为“打开”或“另存为”对话框返回或设置标志选项。部分Flags属性值的设置参见表7.4。
7.1.4“颜色”对话框 将通用对话框的Action属性值设置为3,或使用ShowColor方法,都可以调出“颜色”对话框。见图7.7。
7.1.4“颜色”对话框 1.Flags属性 • 该属性返回或设置“颜色”对话框选项。其值为: 2.Color属性 该属性返回或设置选定的颜色。当用户在调色板中选中某颜色时,将该颜色值赋给了Color属性。
7.1.5 “字体”对话框 将通用对话框的Action属性值设置为4,或使用ShowFont方法,都可以调出“字体”对话框。
7.1.5 “字体”对话框 “字体”对话框除了基本属性外,还有与字体有关的属性,如FontName(字体名)、FontSize(字体大小)、FontBold(粗体)、FontItalic(斜体)、FontUnderLine(下划线)、FontStrikeThru(删除线)与Color(颜色)等。在使用Commondialog控件选择字体对话框之前,必须设置Flags属性值,尤其是使用Color属性,必须使Flags含有cdlCFEffects值,“字体”对话框的Flags属性的设置值见表7.6。
7.1.6“打印”对话框 • 通用对话框的Action属性值设置为5,或使用ShowPrinter方法,都可以调出“打印”对话框,其界面见图7.11。
7.1.6“打印”对话框 • 在“打印”对话框内可选择打印机。通过“打印”对话框的“属性”按钮可设置打印机的属性。“打印”对话框并不能处理打印工作,仅仅是一个供用户选择打印参数的界面,所选参数存于各属性中,再由用户编程来处理打印操作。 • “打印”对话框的重要属性: 1.Copies:该属性为整数值,指定打印份数。 2.FromPage:打印起始页号。 3.ToPage:打印终止页号。
7.2菜单设计 下拉式菜单和弹出式菜单是窗体菜单的两种主要类型。下拉式菜单位于窗口的顶部,弹出式菜单是独立于菜单栏而显示在窗体上的浮动菜单。在Windows及各种语言软件中,下拉式菜单得到了广泛的应用。
7.2.1菜单编辑器 • 在集成开发环境中的设计模式下,首先要将视图方式切换到对象窗口,然后单击“工具”菜单项中的“菜单编辑器”选项弹出菜单编辑器对话框
创建菜单项步骤 (1) 打开“菜单编辑器”。 (2) 在标题栏输入该菜单项的文本。 (3) 在名称栏输入程序中要引用该菜单项的名称。 (4) 单击下一个按钮或插入按钮,建立下一个菜单项,并通过左、右箭头按钮确定菜单的层次关系。 (5) 不断的重复步骤(2)、(3)、(4),直至所有的菜单项建立完毕。 (6) 单击“确定”按钮,关闭“菜单编辑器”。
7.2.2菜单项的控制 1.有效性控制 • 菜单的有效性控制是指菜单中的某些菜单项应能根据执行条件的不同进行动态变化,它由菜单项的Enabled属性所决定。 • 设置方法有两种:(1)在菜单编辑器中设置。通过菜单编辑器中的“有效”属性复选框进行设置。(2)在程序代码中设置。格式为:菜单名.Enabled=False /(True)。 2.菜单项标记 • 菜单项标记就是在菜单前加上一个“√”,由菜单项的Checked性所决定。同菜单有效性一样,菜单项标记也有两种方法:(1)在菜单编辑器中设置,选中“复选”属性复选框即可。(2)在程序代码中设置,其格式为:菜单名.Checked=True /(False)。
7.2.3菜单项的增减 (1)在“菜单编辑器”对话框中,加入一个菜单项,将其索引(Index)项属性设置为0 (2)在菜单中加入名称相同、Index相邻的菜单项。也可以只有一个Index 为0的选项 (3)在运行时通过菜单控件数组名和索引值使用Load方法加入新的菜单项。 (4)使用Unload方法,删除菜单项。
7.2.4弹出式菜单(快捷菜单) • 弹出式菜单是一种小型菜单,它独立于窗体菜单栏而显示在窗体内的浮动菜单。可通过单击鼠标右键在窗体的任意位置打开,其显示位置取决于单击鼠标键时指针的位置。因而,使用方便,具有较大的灵活性,又有快捷菜单之称。 • 设计弹出式菜单与设计一般的菜单类似,一样可以在菜单编辑器中建立,只需将菜单名的Viaible 属性设计为False,即去掉“可见”复选框中的“√”。Visual Basic提供了PopupMenu方法来显示弹出式菜单。当使用PopupMen方法时,它忽略了Visible的设置。其格式为: [对象.]PopupMenu 菜单名 [,标志,x,y] • 其中:x、y坐标参数指定弹出式菜单显示的位置,如果没有给出 x 和 y 坐标,则弹出式菜单就显示在鼠标指针当前的位置。“标志”参数用于进一步定义弹出式菜单的位置和行为,其取值见表7.9和表7.10。
7.3多重窗体程序设计 • 多重窗体是指一个应用程序中有多个并列的普通窗体。在多重窗体中,各个窗体是平等的,每个窗体都有自己的界面和程序代码,具有一定的特点和功能,并且在某一时刻只能有一个窗体被激活,但窗体之间往往有关联关系。 1. 多重窗体的建立 • 用户可以通过“工程”菜单上的“添加窗体”来实现,添加的窗体可以是新窗体,也可以是别的工程的现存窗体,注意: (1)该工程内的每个窗体的Name属性不能相同,否则不能将现存的窗体添加进来; (2)在该工程内添加进来的现存窗体实际上在多个工程中共享,因此,对该窗体所作的改变,会影响到共享该窗体的所有工程。要使该窗体与其它工程不共享,则需通过“文件“菜单”上的“另存为”将该窗体另存。
7.3多重窗体程序设计 2.设置启动窗体 • 缺省的启动窗体是第一个加入的窗体,即系统自动为工程创建的Form1。如果要改变启动窗体,可通过“工程”菜单的“工程属性”,在其“通用”选项卡的“启动对象”下拉列表选择要作为启动窗体的窗体。也可选择Main()作为启动过程。如果指定Main()子过程作为启动对象,而且有窗体存在的话,则必须在Main()重装入和显示应用程序窗体。如设窗体名为Form1,则作为启动对象的Main()子过程为: sub Main() set Fmainform=New Form1 fmainform.show end sub • 注意:Main()子过程必须放在工程中的标准模块中,不能放在窗本模块内。
7.3多重窗体程序设计 3.多重窗体的操作语句、方法 (1)load语句:该语句把一个窗体装入内存。 (2)Unload语句:该语句与Load语句的功能相反,它从内存中删除指定的窗体。其格式为: Unload 窗体名称 Unload的一种常见用法是Unload me ,表示关闭窗体自己。 (3)show 方法:该方法用来显示一个窗体,他兼有加载和显示窗体两种功能。其格式为: [窗体名称].Show [模式] 其中:“模式”参数用来确定窗体的工作状态,有0 和1两个值。若“模式”为1,表示窗体是“模式型”(Model),用户无法将鼠标移到其它窗口。若“模式”为0,表示窗体是“非模式型”,可以同时对其他窗体进行操作。“模式”参数的默认值为0。 (4)Hide方法:该方法用来将窗体暂时隐藏起来。
7.4多文档界面程序设计 多文档界面(MDI,即Multiple Document Interface)是典型的Windows应用程序界面。多文档界面由一个(只能一个)父窗体和多个子窗体组成,父窗体或称MDI窗体是作为子窗体的容器(见图7.16)。子窗体或称文档窗体显示各自文档。例如Microsoft Excel和Micro Word都具有多文档界面。与多文档界面相对的是单文档界面(SDI,即Single Document Interface),例如Windows中的“记事本”应用程序就是单文档界面。
7.4多文档界面程序设计 与一般的窗体相比,MDI窗体具有自己的特性: 1.父窗体(即MDI)只能有且仅有一个。2.子窗体一般至少有一个。3.用户可以改变和移动子窗体的大小,但被限制在MDI窗体中。4.子窗体最小化后的图标位于MDI窗体的底部(不是在任务栏);且MDI窗体、子窗体和普通窗体图标在工程窗口中的表示方式不同(见图7.17)
7.4多文档界面程序设计 5.MDI窗体最小化时(图标在任务栏),所有的子窗体也同时最小化,并且MDI窗体及其所有子窗体统一由一个图表来代表。 6.还原MDI窗体时MDI窗体及其所有子窗体将按最小化之前的状态显示出来。 7.MDI窗体和子窗体都可以有各自的菜单,当子窗体加载时覆盖MDI窗体的菜单。 8.MDI窗体上只能放置图片框或菜单栏、工具栏、状态栏和定时器、通用对话框等少数控件外,不能创建其他控件。 9.在不同窗体中共用的过程变量应存放在标准模块中,这与多重窗体是一样的。
7.4.1创建和设计MDI窗体及其子窗体 1.创建MDI窗体 • 首先进入Visual Basic的系统集成环境,建立新的工程文件,选择“工程”菜单下的“添加MDI窗体”命令,在随后出现的对话框中单击“打开”按钮,即为工程创建一个MDI主窗体。其默认窗体名为MDIForm1。 2.将一般窗体变为MDI子窗体 • 一般在启动Visual Basic后,系统自动创建了一个窗体Form1,在建立了MDI窗体之后,Form1窗体还不是MDI中的一员,要想让它成为子窗体,必须将其MDIChild属性设置为True。如果要在设计模式下添加多个子窗体,可先通过“工程”菜单下的“添加窗体”命令添加普通窗体,然后再将普通窗体的MDIChild属性设置为True。
7.4.1创建和设计MDI窗体及其子窗体 3.在运行时创建MDI子窗体 先在设计模式下创建一个子窗体作为运行时创建MDI子窗体的模板,然后通过对象变量来实现。如先建立了一个Name为“frmMDIChild”的窗体模板,则下面的语句: Dim NewDoc As New frmMDIChild 就会为“frmMDIChild”建立一个新的实例NewDoc。 New表示隐式的创建对象的关键字,关键字后应为“类名”。窗体程序运行时建立一个子窗体的程序代码如下: Public Sub FileNewProc() Dim NewDoc As frmMDIChild Static No As Integer No=No+1 NewDoc.Caption=”no” & No NewDoc.Show End Sub 每调用FileNewProc过程一次,则产生一个“frmMDIChild”的实例。
7.4.1创建和设计MDI窗体及其子窗体 3.在运行时创建MDI子窗体 先在设计模式下创建一个子窗体作为运行时创建MDI子窗体的模板,然后通过对象变量来实现。如先建立了一个Name为“frmMDIChild”的窗体模板,则下面的语句: Dim NewDoc As New frmMDIChild 就会为“frmMDIChild”建立一个新的实例NewDoc。 New表示隐式的创建对象的关键字,关键字后应为“类名”。窗体程序运行时建立一个子窗体的程序代码如下: Public Sub FileNewProc() Dim NewDoc As frmMDIChild Static No As Integer No=No+1 NewDoc.Caption=”no” & No NewDoc.Show End Sub 每调用FileNewProc过程一次,则产生一个“frmMDIChild”的实例。
7.4.2 MDI窗体与子窗体的交互 1.加载MDI窗体及子窗体 • 如果工程的启动对象为某个子窗体,则程序运行时会同时启动MDI窗体与该子窗体。但如果工程的启动对象设置为MDI窗体,则程序运行后,系统只会自动加载并显示MDI窗体,其子窗体不会自动加载。 • MDI窗体由AutoShowChildren属性,决定是否自动显示子窗体。如果它被设置为True,则当改变子窗体的属性(如Caption等)后,会自动显示该子窗体,不再需要Show方法;如果AutoShowChildren设置为False,则改变子窗体的属性后,不会自动显示该子窗体,子窗体处于隐藏状态直至用Show方法把它们显示出来。
7.4.2 MDI窗体与子窗体的交互 2.关闭MDI窗体 和普通窗体一样,关闭MDI窗体用Unload 方法,其格式如下: Unload Me 系统在执行该代码后,将先触发QueryUnload事件,如果需要保存有关信息及其它处理,可在该事件代码中完成。先卸载各子窗体,然后卸载MDI窗体。。
7.4.2 MDI窗体与子窗体的交互 3.访问活动子窗体和活动控件 在Visual Basic中,为程序员提供了两个属性来访问MDI中的当前活动子窗体与活动控件,即ActiveForm和ActiveControl,前者表示获得焦点的或者最后被激活的子窗体,后者表示活动子窗体上获得焦点的控件。 例如,假设想从子窗体的文本框中把所选文本复制到剪贴板上,在应用程序的“编辑”菜单上有一个“复制”菜单项,它的Click事件调用了CopyProc子过程,把选定的文本复制到剪贴板上,CopyProc的代码如下: Sub CoprProc() ClipBoard.SelText=frmMDI.ActiveControl.SelText End Sub 注意:当访问ActiveForm属性时,所有MDI子窗体都是由同一个子窗体模板通过New关键字创建的,并且至少应有一个MDI子窗体被加载或可见,否则会返回一个错误。 在代码中指定当前窗体的另一种方法是用Me关键字。当需要把当前窗体对象的引用参数传递给过程时,这个关键字很有用。如前面讲的关闭当前窗体用Unload Me即可。
7.4.2 MDI窗体与子窗体的交互 4.MDI窗体的Arrange方法 Arange方法用以规定MDI所有子窗体或图表的排列方式。其格式为: MDI窗体名.Arrange Arrengement Arrangement是必要参数,为一个数值或常数,指定如何重排MDI窗体中的所有子窗体或图标,其含义如表所示。