第5章 创建应用程序界面.docx_第1页
第5章 创建应用程序界面.docx_第2页
第5章 创建应用程序界面.docx_第3页
第5章 创建应用程序界面.docx_第4页
第5章 创建应用程序界面.docx_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章 创建应用程序界面在开发一个应用程序时,设计应用程序的用户界面是十分重要的。本章讨论如何使用VB中窗体和菜单来布局安排应用程序的界面。5.1 窗 体窗体(Form)是一个窗口或对话框,是存放控件的容器。打开VB的工程文件,首先看到的就是窗体,因此,窗体是应用程序的第一个对象。在VB中可以灵活地使用窗体,既可以同时显示程序的所有窗体,也可以按程序的需要显示或隐藏某些窗体。实际上,窗体是设计态的类的概念,而窗口则是运行态的类的实例即对象的概念。5.1.1 常用属性窗体有很多属性,常用的属性如下:(1)Appearance属性设置窗体是否在运行时以3D效果显示。其使用语法如下:窗体名.Appearance=0或1为0时窗体以平面形式显示;为1(默认值)时窗体以立体形式显示。(2)AutoRedraw属性设置窗体被遮盖后是否要自动重绘窗体上的内容。其使用语法如下:窗体名.AutoRedraw=True或False为True时表示自动重绘;为False(默认值)时表示不重绘。(3)BackColor属性和ForeColor属性分别设置窗体上对象的背景色和前景色。(4)BorderStyle属性设置窗体的边框样式。其使用语法如下:窗体名.BorderStyle=值其中的“值”可以为05。0表示无边框;1表示窗体大小固定且具有单线边框;2(默认值)表示窗体大小可调整的边框;3表示窗体大小固定的边框;4表示窗体为单线固定工具窗口,且只包含关闭按钮;5表示窗体为可调整的工具窗口,且只包含关闭按钮。(5)Caption属性设置窗体的标题内容。其使用语法如下:窗体名.Caption=字符串(6)FillStyle属性设置窗体上几何图形的样式。其使用语法如下:窗体名.FillStyle=值其中的“值”可以为07,其默认值为1(透明)。(7)Icon属性设置窗体在最小化后呈现的图标。(8)MaxButton属性设置窗体在执行时是否含有最大化按钮。其使用语法如下:窗体名.MaxButton=True或False为True(默认值)时表示含有最大化按钮;为False时表示不含有最大化按钮。(9)MDIChild属性设置这个窗体是否含有另一个MDI子窗体。其使用语法如下:窗体名.MDIChild=True或False为True时表示有另一个MDI子窗体;为False(默认值)时表示没有另一个MDI子窗体。(10)MinButton属性设置窗体在执行时是否含有最小化按钮。其使用语法如下:窗体名.MinButton=True或False为True(默认值)时表示含有最小化按钮;为False时表示不含有最小化按钮。(11)Movable属性设置窗体是否可以移动。其使用语法如下:窗体名.Movable=True或False为True(默认值)时表示可以移动;为False时表示不能移动。(12)Picture属性设置窗体所要显示的图片。(13)ScaleMode属性设置窗体的度量单位。其使用语法如下:窗体名.ScaleMode=值其中的“值”可以为07。0表示自定义;1(默认值)表示为缇;2表示为磅;3表示为像素;4表示为字符;5表示为英寸;6表示为毫米;7表示为厘米。(14)Visible属性设置窗体在执行时是否可见或是隐藏起来。其使用语法如下:窗体名.Visible=True或False为True(默认值)时表示看得见;为False时表示隐藏起来。(15)WindowsState属性设置窗体在执行时的状态。其使用语法如下:窗体名.WindowsState=值其中的“值”可以为02。0(默认值)表示为一般;1表示为最大化;2表示为最小化。5.1.2 常用事件VB的窗体有很多事件,下面介绍几个常用的事件。(1)Activate事件当窗体变为活动窗口时发生。(2)Click事件当用户在一个对象上按下并释放鼠标按钮时发生。(3)DblClick事件当用户在一个对象上按下并释放鼠标按钮后再次按下并释放鼠标按钮时发生。(4)Deactivate事件当窗体不再是活动窗口时发生。(5)Initialize事件当应用程序创建一个窗体、MDI 窗体或类的实例时发生。(6)Load事件当加载窗体时发生。(7)MouseDown事件当用户在拥有焦点的对象上按下鼠标按钮时发生。(8)QueryUnload事件在关闭窗体或应用程序之前发生。(9)Resize事件当第一次显示一个窗体时或改变一个对象的大小时发生。(10)Terminate事件当从内存中删除一个窗体、MDI 窗体或类的所有引用时发生。(11)Unload事件当要从屏幕上删除窗体时发生。5.1.3 常见方法和语句VB的窗体有多个方法和语句,可以通过这些方法和语句对窗体进行加载、显示、隐藏和卸载等操作。下面介绍几个常见方法和语句。(1)Load语句该语句用来将新创建的窗体加载到内存中,当VB加载窗体对象时,先把窗体属性设置为初始值,再执行Load事件过程。当应用程序开始运行时,VB自动加载并显示应用程序的启动窗体。其语法如下:Load 例如Load Form1就是把Form1窗体加载到内存中。(2)Show方法用来显示一个已经装入内存的窗体。其语法如下:窗体.Show模式其中“模式”有两个取值:0(默认值)表示非模化的,1表示模化的。M注意:如果调用Show方法时指定的窗体没有加载,VB将自动加载该窗体。(3)Hide方法用于隐藏显示在屏幕上的窗体。隐藏窗体时,将从屏幕上删除窗体,并将其Visible属性设置为False。用户将无法访问隐藏窗体上的控件,但是运行中的VB应用程序并不卸载它,仍然可以使用隐藏窗体的控件。其语法如下:窗体.HideM注意:如果调用Hide方法时指定的窗体没有加载,VB将自动加载该窗体,但不显示它。(4)Unload语句用来卸载窗体。在窗体卸载之后,所有在运行时放到该窗体上的控件都不再是可访问的,在设计时放到该窗体上的控件将保持不变。对窗体上任何控件的访问都会导致窗体重新加载,但在重新加载窗体时,在运行时对这些窗体上的控件及其属性的任何更改将会丢失,所有对于窗体属性的更改也将会丢失。其语法如下:Unload窗体5.1.4 窗体的生命周期由于窗体和控件是可见的,所以它们与其他对象的生命周期不同。例如,即使释放了对窗体的所有引用,也不会关闭该窗体。VB维护整个工程中所有窗体的集合,只有当窗体卸载时才能从集合中删除该窗体。通常地,VB窗体在整个生命周期中要经历4个状态,我们分别予以讨论。1. 创建但不加载Initialize事件是该状态开始的标志。因而,放在Form_Initialize事件过程中的代码,就是窗体创建时最先执行的代码。处于这种状态时,窗体是作为一个对象而存在,但还没有窗口。而且它的控件也不存在。虽然该状态可能很短暂,但任何窗体都要经过该状态。一旦Form_Initialize事件过程结束,在不强制加载窗体的情况下,所能执行的过程只能添加到该窗体代码窗口的Sub,Function和Property过程中。2. 加载但不显示Load事件标志这个状态的开始。一旦窗体进入加载状态,Form_Load事件过程中的代码就开始执行。Form_Load事件过程开始后,窗体上的所有控件都被创建和加载,而且该窗体有了一个窗口,也就是系统为窗体建立了“窗口句柄(hWnd)”和“设备描述体(hDC)”,尽管该窗口还未显示。任何窗体只有加载后才能可见。很多窗体自动从创建但不加载状态进入加载但不显示状态,最后进入显示状态。调用窗体的Show方法便能实现这一点。但有时需要窗体保持加载状态,但不显示。这是通过Form_Load事件过程中调用窗体的Hide方法实现的。任何时候,只要隐藏了窗体,它就总是从可见状态回到加载状态。回到加载状态并不重新执行Load事件。Form_Load事件过程在窗体的存活期中只运行一次。3. 显示状态一旦窗体可见,用户就能和它交互作用。当然,窗体在卸载前可以任意隐藏及显示。Form1.Show 显示窗体Form1Form1.Hide 隐藏窗体Form1窗体在卸载时可以是隐藏的,也可以是可见的。若没有隐藏,则它保持可见直到卸载完毕。窗体卸载之前,最后发生的事件为Unload事件。该事件发生前,会有另一个重要的事件QueryUnload发生。如果某些数据希望保存,可在QueryUnload事件过程中提示保存或忽略所做的更改的信息。M注意:QueryUnload提供了停止窗体卸载的机会。把QueryUnload的参数Cancel设置为True,就会忽略Unload语句,从而不卸载窗体。4. 完全释放内存和资源释放内存和资源的惟一办法就是卸载窗体,并把所有引用设置为Nothing。这种做法常常会漏掉那些隐含的全局变量引用。如果使用了类名(正如“属性”窗口中的Name属性所示)来引用窗体,就等于使用隐含全局变量。为了释放窗体占用的内存,必须把该变量设置为Nothing。例如:Set Form1=Nothing该窗体在撤销前会接收到Terminate事件。5.1.5 使用控件数组在应用程序编写过程中,可能用到一些类型相同且功能相近的控件,这时可以将这些控件定义为控件数组。使用控件数组类似于使用数组变量,其特点如下: 具有相同的名称(Name)。 通过索引值(下标)来区别控件数组中的元素。使用控件数组可以节省系统内部资源,增加程序的可读性。当有多个控件数组成员执行大致相同的操作时,控件数组共享同样的事件过程。在程序运行过程中,可以利用控件数组返回的索引值来标识触发事件的成员。在程序运行中也可以创建新控件,该控件必须是控件数组的成员,即控件名称已经在界面设计中创建,只需设置索引值。所创建的每个控件数组的新成员继承数组的公共事件过程,编写程序非常灵活、方便。创建控件数组的方法有: 给多个控件定义相同的控件名称。 在窗体上复制并粘贴相同类型的控件。 设置控件的索引属性Index的值为非Null数值。1. 通过改变控件名称添加控件数组元素对于类型相同的控件,可通过修改控件的名称创建控件数组。其方法为:(1)确定某个控件是数组成员(记住其名称)的第一个元素,在窗体上绘制出一个同类型的控件。(2)将新绘制的控件名称定义为数组名称,系统会弹出一个对话框,提示“是否创建控件数组”。单击“是(Y)”即可完成操作。向控件数组中添加新成员,可反复进行上述操作,系统不再弹出“是否创建控件数组”对话框,其索引值自动递增。2. 指定控件的索引值选定需要作为控件数组的第一个成员的控件,将该控件的索引属性Index的值设置为0,然后采用前两种方法均可创建控件数组,系统将不会显示“是否创建控件数组”对话框。5.1.6 焦点与Tab键序焦点是接收用户鼠标或键盘输入的能力。当对象具有焦点时,可接收用户的输入。在Microsoft Windows环境中,任一时刻都可以运行几个应用程序,但只有具有焦点的应用程序才有活动标题栏(蓝色标题栏),也只有具有焦点的程序才能接受用户输入(键盘或鼠标的动作)。并非所有的控件都具有接收焦点的能力,Frame,Lable,Menu,Line,Image和Timer等控件均不能接收焦点。而且只有不包含任何可接收焦点的控件的窗体,才能接收焦点。当对象得到或失去焦点时,会产生GotFocus或LostFocus事件。窗体和多数控件支持这些事件。从事件的名称上不难看出,GotFocus事件发生在对象得到焦点时,LostFocus事件发生在失去焦点时。使用以下的操作方法可以将焦点赋予对象: 运行时选择对象。 运行时用快捷键选择对象。 在代码中使用SetFocus方法。大多数的控件得到或失去焦点时的外观是不相同的,如命令按钮得到焦点后周围会出现一个虚线框。文本框得到焦点后会出现闪烁的光标等等。当对象的Enabled和Visible属性为True时,它才能接收焦点。Enabled属性允许对象响应由用户产生的事件,如键盘和鼠标事件。Visible属性决定了对象在屏幕上是否可见。所谓Tab键序指的是在用户按下Tab键时,焦点在控件间移动的顺序。每个窗体都有自己的Tab键序。默认状态下Tab键序与建立这些控件的顺序相同。例如在窗体上建立3个命令按钮Command1,Command2和Command3,程序启动时Command1首先获得焦点。当用户按下Tab键时焦点依次向Command2、Command3转移,就这样往复循环。如果希望更改Tab键序,例如希望焦点直接从Command1转移到Command3,可以通过设置TabIndex属性来改变一个控件的Tab键顺序。控件的TabIndex属性决定了它在Tab键顺序中的位置。按照默认规定,第一个建立的控件其TabIndex值为0,第二个的TabIndex值为1,以此类推。当改变了一个控件的Tab键顺序位置,VB将自动为其他控件的Tab键顺序位置重新编号,以反映插入和删除操作的结果。例如,要使Command3变为Tab键顺序中的首位,其他控件的TabIndex值将自动调整。M注意:不能获得焦点的控件,以及无效的和不可见的控件,不具有TabIndex属性,因而不包含在Tab键顺序中。按Tab键时,这些控件将被跳过。通常,运行时按Tab键能选择键顺序中的每一控件。将控件的TabStop属性设为False,便可将此控件从键顺序中删除。TabStop属性已设置为False的控件,仍然保持它在实际Tab键顺序中的位置,只不过在按Tab键时这个控件将被跳过。5.1.7 窗体设计例子【例5.1】 本例创建一个工程Proj5.1,在其中添加一个窗体Form1,其基本属性如下:NameForm1Caption窗体例子Picturesummer.jpg本窗体的设计界面如图5.1所示,不设计任何事件过程。将工程Proj5-1的“启动对象”设置为Form1,启动本工程,执行界面如图5.2所示。图5.1 窗体设计界面图5.2 窗体执行界面【例5.2】 本例在上例建立的Proj5-1工程中添加一个窗体Form2,其基本属性如下:BackColor&H00FFC0C0&Caption窗体例子MaxButton= 0 FalseMinButton= 0 False然后在其中加入两个标签label1和label2,设计界面如图5.3所示。图5.3 Form2设计界面最后在该窗体上设计如下事件过程:Private Sub Form_Click() Label2.Caption =你单击了窗体End SubPrivate Sub Form_dblClick() Label2.Caption=你双击了窗体End SubPrivate Sub Form_Load() Label1.Caption=窗体中的标签End Sub将工作Proj5-1的“启动对象”设置为Form2,启动本工程执行界面如图5.4所示,我们看到在启动窗体时立即执行上面的Load事件过程。然后在该窗体的任何地方单击鼠标,便在标签label2中显示“你单击了窗体”的提示,如图5.5所示。若在该窗体的任何地方双击鼠标,便在标签label2中显示“你双击了窗体”的提示。图5.4 Form2执行界面(a)图5.5 Form2执行界面(b)5.2 菜 单 设 计菜单是应用系统的组成部分之一,它一般由菜单栏和下拉菜单组成,如VB的系统集成环境中的菜单栏。从结构上看,菜单可分成若干级,第一级是菜单栏,它包括若干菜单项,菜单项为横向排列,每一菜单项都可对应一个下拉式子菜单,子菜单中的选项竖向排列,同时子菜单中的每一项又可对应有自已的下拉菜单。5.2.1 建立菜单建立菜单的过程是先列出菜单的组成,然后在“菜单编辑器”窗口按照菜单组成进行设计,设计完后,再把各菜单项与代码连接起来。选择“工具”菜单中的“菜单编辑器”或单击工具栏中的“菜单编辑器”快捷按钮打开菜单编辑器,如图5.6所示。图5.6 “菜单编辑器”窗口从形式上看,该窗口由以下几部分组成:1. 属性设置菜单是一个特殊的控件,其中的每一个菜单项也是一个控件。“菜单编辑器”窗口的上方部分用于设置每个菜单项的基本属性。 “标题”文本框:设置菜单项的标题,即菜单项的Caption属性。如果在“标题”文本框中输入一个“-”,表示该菜单项为一个分割条。 “名称”文本框:设置菜单项的名称,即菜单项的Name属性。 “索引”文本框:设置菜单控件数组下标,即菜单项的Index属性。 “快捷键”组合框:为菜单项选择一个快捷键。 “帮助上下文”文本框:通过输入数字来选择帮助文件中特定的页数或与该菜单上下文相关的帮助文件。 “协调位置”组合框:通过这个选择来确定菜单是否出现或怎样出现。只有三种选择:不设置、靠左边和居中。 “复选”复选框:允许用户设置某一菜单是否可选。 “有效”复选框:用来设置菜单项是否可执行。 “可见”复选框:如果设计菜单项时,“可见”复选框未被选中,则该菜单项是不可见的。 “显示窗口列表”复选框:设置在使用多文档应用程序时,是否使菜单控件中有一个包含打开的多文档文件子窗口的列表框。2. 菜单项编辑按钮“菜单编辑器”窗口的中部有7个按钮用于编辑菜单的菜单项。 “下一个”按钮:编辑下一个菜单项。 “插入”按钮:插入一个菜单项。 “删除”按钮:删除当前菜单项。 “”和“”按钮:用于调整菜单项的位置。单击“”按钮时,菜单项上移一行;单击“”按钮时,菜单项下移一行。 “”和“”按钮:用于调整菜单项的级别。在菜单项显示区,菜单项的前面显示有不同的内缩符号“.”(四个黑点)。主菜单项没有内缩符号,一级下拉菜单中的菜单项前有一个内缩符号,二级下拉菜单中的菜单项有两个内缩符号。对显示区中选中的菜单项,要降低一个层次时,单击一次“”按钮,可在菜单项前加上一个内缩符号;要提高一个层次时,单击一次“”按钮,删除一个内缩符号。3. 菜单项显示区“菜单编辑器”窗口的下方有一个区域,用于显示用户输入的菜单项,即Caption属性。根据显示的各菜单项前面内缩符号多少,可确定菜单的层次。在完成菜单的编辑工作之后,就需要单击“确定”按钮,此时系统将检查菜单的有效性,若检查通过,即保存该菜单并返回到窗体上显示其主菜单项;否则,系统将显示对话框提示相应错误信息。当需要放弃或取消本次编辑菜单的操作时,可以单击“取消”命令按钮。5.2.2 把代码连接到菜单上在VB中,每一菜单项都是一个控件,都响应某一事件过程。一般来说,菜单项都响应鼠标单击事件,即每个菜单项都拥有一个事件处理过程Name_Click()(这里的Name表示菜单项的名称)。每当单击菜单项时,VB就调用Name_Click()过程,执行这一过程中的代码。编写代码是在代码窗口中进行的。首先在窗体中单击菜单栏,在下拉菜单中选择要连接代码的菜单项,然后单击这一菜单项,在屏幕上会出现代码窗口,并在窗口中出现这一菜单项的名称和相应事件组成的事件处理过程的过程头与过程尾。用户只要在过程头与过程尾之间输入想执行的某项任务的代码即可。如果想为其他菜单项添加代码,可以按上面的方法,也可以从对象列表框中选择菜单项名称,再在过程列表框中选择Click事件,这时代码窗口中出现了这一菜单的过程头与过程尾,在其中添加代码即可。如果有多个菜单项需要与代码过程连接,就要多次重复上述步骤。5.2.3 动态修改菜单状态用“菜单编辑器”创建、定义完毕的菜单,在程序运行过程中并非就一成不变。用户可以根据实际运行情况动态地调整和控制菜单的使用,给菜单增加一些灵活性。如当某菜单项执行的操作不适合当前环境时,可以暂时使其失效或干脆将其隐藏起来,就像根本没有这个菜单项一样。当需要时也可以向菜单中添加或删除某菜单项。实际上这些操作都是通过菜单项的Enabled和Visible等属性值设置实现的,我们将在下面的例5.4中详细讨论。5.2.4 建立菜单的例子【例5.3】 本例在前例已有的工程Proj5-1中添加一个窗体Form3,在该窗体中加入一个标签label1,然后启动“菜单编辑器”窗口进行菜单设计,设计界面如图5.7所示,该菜单的定义如下(其中括号里指出对应菜单项的名称): 体育(menu1) .球类(menu11) .足球(menu111) .蓝球(menu112) .- (sepbar) .羽毛球(menu113) .乒乓球(menu114) .排球(menu115) .游泳(menu12) .蛙泳(menu121) .自由泳(menu122) .蝶泳(menu123) .仰泳(menu124) 军事(menu2) .军种(menu21) .空军(menu211) .海军(menu212) .陆军(menu213) .武器(menu22) .枪(menu221) .炮(menu222) .航空母舰(menu223) .火箭(menu224)图5.7 菜单编辑器再返回到该窗体,此时窗体上方出现如图5.8所示的菜单。单击图5.8中每个菜单项,出现对应的Name_Click事件过程名,在其中设置事件过程代码。本菜单上包含的事件过程如下:图5.8 Form3菜单例子设计界面Private Sub menu111_Click() Label1.Caption = 你的选择是足球End SubPrivate Sub menu112_Click() Label1.Caption = 你的选择是蓝球End SubPrivate Sub menu113_Click() Label1.Caption = 你的选择是羽毛球End SubPrivate Sub menu114_Click() Label1.Caption = 你的选择是乒乓球End SubPrivate Sub menu115_Click() Label1.Caption = 你的选择是排球End SubPrivate Sub menu121_Click() Label1.Caption = 你的选择是蛙泳End SubPrivate Sub menu122_Click() Label1.Caption = 你的选择是自由泳End SubPrivate Sub menu123_Click() Label1.Caption = 你的选择是蝶泳End SubPrivate Sub menu124_Click() Label1.Caption = 你的选择是仰泳End SubPrivate Sub menu211_Click() Label1.Caption = 你的选择是空军End SubPrivate Sub menu212_Click() Label1.Caption = 你的选择是海军End SubPrivate Sub menu213_Click() Label1.Caption = 你的选择是陆军End SubPrivate Sub menu221_Click() Label1.Caption = 你的选择是枪End SubPrivate Sub menu222_Click() Label1.Caption = 你的选择是炮End SubPrivate Sub menu223_Click() Label1.Caption = 你的选择是航空母舰End SubPrivate Sub menu224_Click() Label1.Caption = 你的选择是火箭End Sub将工程Proj5-1的“启动对象”设置为Form3,启动本工程,单击“军事|武器|航空母舰”菜单项,其执行屏幕如图5.9所示。图5.9 Form3执行界面【例5.4】 本例在前例已有的工程Proj5-1中添加一个窗体Form4,在该窗体中加入三个标签(名称分别为label1,label2和label3)和三个文本框(名称分别为text1、text2和text3)。然后启动“菜单编辑器”窗口进行菜单设计,设计界面如图5.10所示,该菜单的定义如下(其中括号里指出对应菜单项的名称):运算(Oper).加法(Add).减法(Sub).乘法(Mul).-(Spbar).除法(Div)退出(Exit)图5.10 Form4动态菜单设计界面在该窗体菜单控件上设计如下事件过程:Private Sub Add_Click() Text3.Text = Val(Text1.Text) + Val(Text2.Text)End SubPrivate Sub Mul_Click() Text3.Text = Val(Text1.Text) * Val(Text2.Text)End SubPrivate Sub Oper_Click() If Val(Text2.Text) = 0 Then Div.Enabled = False Else Div.Enabled = True End IfEnd SubPrivate Sub Sub_Click() Text3.Text = Val(Text1.Text) - Val(Text2.Text)End SubPrivate Sub Div_Click() Text3.Text = Val(Text1.Text) / Val(Text2.Text)End SubPrivate Sub Exit_Click() EndEnd Sub将工程Proj5-1的“启动对象”设置为Form4,启动本工程,在文本框text1中输入“12”,单击“运算”菜单项,出现下拉菜单,此时由于未在text2文本框中输入任何数据,所以“除法”菜单项是禁用的,如图5.11所示。然后在text2文本框中输入“2”,再单击“运算”菜单项,出现的下拉菜单中的“除法”菜单项变成有效的,如图5.12所示,单击“除法”菜单项,其结果如图5.13所示。图5.11 Form4动态菜单执行界面(a)图5.12 Form4动态菜单执行界面(b)图5.13 Form4动态菜单执行界面(c)5.3 弹出式菜单上节介绍的菜单是一般菜单,它出现在窗口的顶部,当用户执行某一菜单项时,就必须把鼠标指针移动到窗口顶部,这对于常用的功能来说是很不方便的。本节介绍另一类型的菜单即弹出式菜单的设计,只需用户在窗体上单击某一鼠标键(一般为鼠标右键)就可立即弹出该菜单,从而加快用户的操作,所以弹出式菜单也称为快捷菜单。5.3.1 弹出式菜单设计弹出式菜单的设计过程与上节介绍的一般菜单设计过程基本相同,只需将该菜单的“可见”复选框不选中,即不可见,这样,该菜单就不在窗体中直接显示出来。M注意:实际上,不管该菜单是否可见,都可以成为弹出式菜单,只是我们一般习惯上都使它成为不可见的。为了显示弹出式菜单,可以使用PopupMenu方法,该方法的语法如下:PopupMenu “菜单名”,flags,x,y,boldcommand其中,flags参数为一些常量数值的设置,包含位置及行为两个指定值,当PopupMenu方法中没有给出x值时,flags参数为行为参数。flags位置常量的取值如下:0(默认):菜单的左上角位于x4:菜单上框中央位于x8:菜单右上角位于xflags行为常量的取值如下:0(默认):菜单命令只接收右键单击。2:菜单命令可接收左、右键单击。boldcommand参数指出弹出式菜单中想用粗体显示的菜单项名称(只有一个菜单项具有加粗效果)。例如,以下命令:PopupMenu Oper,0,Div其中,Oper为菜单名,Div为菜单项名,该命令弹出的菜单如图5.14所示,我们看到名称为Div的菜单项(标题为“除法”)为粗体。图5.14 弹出式菜单5.3.2 弹出式菜单设计例子【例5.5】 本例在前例已有的工程Proj5-1中添加一个窗体Form5,在该窗体中加入三个标签(名称分别为label1、label2和label3)和三个文本框(名称分别为text1、text2和text3)。然后启动“菜单编辑器”窗口进行菜单设计,设计界面如图5.15所示,该菜单的定义如下(其中括号里指出对应菜单项的名称):图5.15 Form5弹出式菜单例子设计界面运算(Oper).加法(Add).减法(Sub).乘法(Mul).-(Spbar).除法(Div)将Oper菜单项的“可见”复选框不选,这样在窗体上看不见该菜单。然后在该窗体上设计如下事件过程:Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single,Y As Single) 单击鼠标右键时执行PopupMenu方法 If Button = 2 Then PopupMenu oper, 2 End IfEnd SubPrivate Sub Add_Click() Text3.Text = Val(Text1.Text) + Val(Text2.Text)End SubPrivate Sub Mul_Click() Text3.Text = Val(Text1.Text) * Val(Text2.Text)End SubPrivate Sub Sub_Click() Text3.Text = Val(Text1.Text) - Val(Text2.Text)End SubPrivate Sub Div_Click() If Val(Text2.Text) 0 Then Text3.Text = Val(Text1.Text) / Val(Text2.Text) Else MsgBox 除零错误(操作数2中输入0或未输入任何数据),vbOKOnly,信息提示 End IfEnd Sub将工程Proj5-1的“启动对象”设置为Form5,启动本工程,在文本框text1中输入“10”,在text2文本框中输入“15”,单击右键,出现如图5.16所示的弹出式菜单,从中选择某个菜单项执行相应的运算。图5.16 Form 5弹出式菜单例子执行界面5.4 多文档界面VB允许在单个容器窗体中创建包含多个窗体的多文档界面(MDI)。多文档界面最明显的例子是Office套装软件,如Office 97中的Word 97、Excel 97等,它们允许用户同时打开多个文件,每个文件占用一个窗口,在VB中称为子窗体,用户可以在已经打开的窗口之间切换。子窗体就是其MDIChild属性设置为True的普通窗体,一个应用程序可以包含许多相似或者不同样式的MDI子窗体。5.4.1 MDI窗体与一般的窗体相比,MDI窗体具有自已的特性。1. MDI窗体的特性(1)主窗口MDI窗体(称父窗体)只能有且必须有一个。(2)子窗体至少有一个。(3)所有的子窗体无论如何操作都不能移出MDI窗体。(4)子窗体最小化后的图标位于MDI窗体的底部(不是在任务栏)。(5)父窗体最小化时(图标在任务栏),所有的子窗体也同时最小化且MDI窗体及其所有子窗体将由一个图标来代表。(6)还原MDI窗体时MDI窗体及其所有子窗体将按最小化之前的状态显示出来。(7)通过设置子窗体的AutoShowChildren属性,可以在程序加载时自动显示或隐藏该窗体。2. MDI窗体的常用属性和方法 ActiveForm属性 只读属性,返回MDI窗体中的活动子窗体的名称。 Arrange方法 在MDI窗体对象内排列窗口或图标。5.4.2 创建MDI界面首先进入VB的系统集成环境,建立新的工程文件,此时,Form1新窗体出现。选择主菜单中“工程”中的“添加MDI窗体”,在随后出现的对话框中单击“打开”命令按钮,即出现MDI主窗体。MDI父窗体的标题和名称属性值均为“MDIForm1”,这是系统初置的。在该窗体上只能放置图片框或菜单控件。在图片框中可以放置其他控件,如命令按钮等。5.4.3 加入MDI子窗体有两种方法可以添入MDI子窗体。1. 将一般窗体变为MDI子窗体一般在启动VB后,系统自动创建了一个窗体Form1,在建立了MDI父窗体之后,Form1窗体还不是MDI中的一员,要想让它成为子窗体,必须将其MDIChild属性设置为True。2. 添加MDI子窗体选择主菜单“工程”中的“添加窗体”,像前面添加MDI父窗体一样,出现添加窗体窗口,选中“窗体”,在屏幕上出现一个新的窗体,将其MDIChild属性设置为True。M注意:在设计阶段,MDIChild属性并不限制子窗体必须在MDI父窗体之内,程序运行时才起作用。5.4.4 加载和关闭MDI窗体及子窗体1. 加载MDI父窗体及子窗体程序运行后,系统会自动加载并显示MDI父窗体,但其子窗体不会自动加载。因此,需要在父窗体的Load事件代码中进行加载并显示子窗体的代码。例如,以下代码加载两个MDI子窗体Form1和Form2:Private Sub MDIForm1_Load Form1.Show Form2.ShowEnd Sub 2. 关闭MDI窗体和普通窗体一样,关闭MDI窗体的代码如下:UnloadMDI窗体名或Unload Me系统在执行该代码后,将触发QueryUnload事件,若需要保存有关信息及其他处理,可在该事件代码中完成。然后卸载各子窗体,最后卸载MDI父窗体。5.4.5 MDI窗体设计例子【例5.6】 新建工程proj5-2,添加一个MDI父窗体MDIForm1,在其上设计一个菜单控件,如图5.17所示,该菜单包含4个菜单项,标题分别为“层叠”、“平铺”、“排列”和“退出”,名称分别为menu1、menu2、menu3和menu4。图5.17 MDI窗体例子设计屏幕另外建立两个MDI子窗体,它们的名称分别为Form1和Form2,标题分别为“第一个MDI子窗体”和“第二个MDI子窗体”,每个MDI子窗体中只有一个标签对象。在MDIForm1窗体上设计如下事件过程:Private Sub MDIForm_Load() Form1.Show Form2.ShowEnd SubPrivate Sub menu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论