2.6 多窗体应用
在大型的应用程序中通常会有多个窗体存在。本书在前面的2.2节中讲述了怎样在一个工程中添加窗体的方法。本节将讲述通过程序代码怎样让窗体之间互相调用和一些与多窗体应用相关的知识。
2.6.1 多窗体应用实例
【实例2.9】设计一个包含两个窗体的程序,两个窗体分别如图2.13和图2.14所示。第一个窗体里有一按钮,上面写着“显示第二个窗体”。第二个窗体里也有一个按钮,上面写着“显示第一个窗体”。通过单击按钮,可以切换显示这两个窗体。
图2.13 第一个窗体
图2.14 第二个窗体
【实现步骤】具体编程步骤如下。
(1)新建一个标准EXE工程。里面自动包含一个名称为Form1的窗体,将其Name(名称)属性改为frmFirst(即将窗体名称从Form1改为了frmFirst),将其Caption属性改为“第一个窗体”,并用Picture属性为窗体增加一个背景图片。
(2)在窗体frmFirst上,使用CommandButton(按钮)控件画一个按钮,并将其Name属性改为cmdShowSecond,将其Caption属性改为“显示第二个窗体”。
(3)选择“工程”菜单,从里面选择“添加窗体”菜单项。
(4)在“添加窗体”对话框的“新建”选项卡内选择窗体图标,单击“打开”按钮。这时,工程资源管理器中会出现Form2窗体的名称,表明工程中已经添加了一个新窗体。
(5)将窗体Form2的Name属性改为frm,将其Caption属性改为“第二个窗体”,并用Picture属性也为其增加一个背景图片。
(6)在窗体frmSecond上,同样使用CommandButton控件画一个按钮,将其Name属性改为cmdShowFirst,将其Caption属性改为“显示第一个窗体”。本例工程文件中对象的属性设置见表2.2。
(7)在设计状态下,用鼠标单击窗体frmFirst(窗体1)的任一露出部位将其激活(或者在资源管理器中双击frmFirst将其激活)。
表2.2 实例2.9中对象属性设置
(8)双击该窗体上的“显示第二个窗体”按钮,打开与该窗体相关联的代码编辑器。并在cmdShowSecond_Click()事件中写入如下代码。
01 frmSecond.Show 02 frmFirst.Hide
其中,第一条语句的作用是将窗体frmSecond(窗体2)显示到屏幕上。第二条语句的作用是将窗体frmFirst从屏幕上清除,隐藏起来。在此语句frmFirst.Hide可以直接写为Hide,起到的效果是一样的,因为省略了窗体名的Hide会以代码所在的模块相关联的窗体名为默认名,即程序代码是通过哪个窗体打开的默认名就是哪个窗体的名称。所以Hide前可以不加窗体名。
(9)将窗体frmSecond激活,并双击其上“显示第一个窗体”按钮,打开代码编辑器。并在cmdShowFirst_Click()事件中写入如下代码。
03 frmFirst.Show 04 frmSecond.Hide
(10)按下F5键运行程序,查看结果。
【代码说明】给窗体或者控件起名字时,应当尽量考虑到见名知意。除此之外,虽然Visual Basic中不区分英文字母的大小写,但是建议最好采用驼峰效应,即从第二个单词开始以后的所有单词的头一个字母都要大写,这样会使自己或者其他人员更方便地读懂程序。
说明
在编写代码时不必注意区分大小写。只是在给控件起名时注意就可以了。例如,在代码编辑区内写frmfirst也是正确的,而且Visual Basic会自动将其变为frmFirst。
本实例虽然简单,但是可以将编写多窗体应用程序的步骤和方法较好的体现了出来。现在读者肯定有了一个问题,为什么总是第一个窗体先启动,如何才能让第二个窗体先启动。在下一小节将讲述解决此问题的方法。
2.6.2 指定启动窗体
在默认情况下,多窗体应用程序中的第一个窗体被指定为启动窗体。应用程序开始运行时,此窗体就会被显示出来。如果想在应用程序启动时显示别的窗体,那么就必须指定启动窗体。例如,想要先启动实例2.9的第二个窗体。操作步骤如下。
(1)选择“工程”菜单中最下面的“工程1属性”菜单项。
(2)在打开的“工程属性”对话框的“通用”选项卡内找到“启动对象”,并在下拉列表中选择需要最先启动的窗体名称frmSecond,然后单击“确定”按钮。(3)按下F5键运行程序。这时会看到第二个窗体先启动了。
2.6.3 多窗体程序的存取
多窗体程序的存取和单窗体程序的存取基本上一样。只是在存储时要注意将多个窗体一个一个的保存好,最后还要记得保存工程。打开时要注意打开工程文件,Visual Basic会自动将属于这个工程文件的窗体全部打开,将其列在工程资源管理器中。下面以保存和打开实例2.9,说明多窗体程序的存取方法。
1. 保存
(1)单击工具栏上的保存工程按钮。
(2)在第一个跳出的“文件另存为”对话框中,选择好保存路径,并输入将要保存的文件名,这里取默认名。单击“保存”按钮。
(3)保存了第一个窗体文件后,还会跳出第二个“文件另存为”对话框,这是在保存另一个窗体。用步骤2的方法保存即可。
(4)保存完两个窗体之后,会跳出“工程另存为”对话框,其默认名称为“工程1”,将其改为“多窗体应用实例”后保存。
说明
工程文件中有多少个窗体,“文件另存为”对话框就会跳出多少个。
2. 打开
(1)单击工具栏中的“打开工程”按钮。
(2)在“打开工程”对话框中,选择需要打开的工程文件,如选择上面保存的“多窗体应用实例.vbp”,单击“打开”按钮。
2.6.4 标准模块和Sub Main过程
1. 标准模块
在使用Visual Basic编程时,编程人员通常会把一些公共变量的声明、公共函数或者过程写在标准模块里。在工程中建立标准模块有如下几种方法。
❑选择“工程”菜单内的“添加模块”菜单项。在打开的“添加模块”窗口中用“新建”选项卡可以新建一个新的模块,用“现存”选项卡可以将一个现存的模块文件导入到本工程中。
❑在工程资源管理器内单击鼠标右键。从弹出的菜单中选择“添加”|“添加模块”菜单项。
❑单击工具栏中“添加窗体”快捷按钮右侧的小三角,从下拉列表中选择“添加模块”。
经过上述操作,可以在工程资源管理器中看到多出了一个Module1,这就是标准模块文件,其扩展名为.bas。双击即可打开Module1中的代码。
2. Sub Main过程
在指定启动窗体时,打开的“工程属性”对话框“启动对象”下拉列表里除了可以看到工程中的窗体名以外还有一个Sub Main,即Sub Main也可以成为启动对象。在多窗体应用程序中,有时需要在启动窗体之前执行一些代码。Sub Main就是为了解决这个问题而应运而生的。
在Visual Basic中称Sub Main为启动过程(注意:这里的过程是名词,并非动词),并且需要写在标准模块中。方法是打开标准模块的代码区后写入
Sub Main
然后回车,将显示该过程的开头和结尾语句,在这两条语句之间输入程序代码即可。通常Sub Main过程中的语句结构是:
Sub Main() ... ... 窗体.show End Sub
其中,在省略号的位置输入在窗体启动前需要执行的代码。等这些代码一条条从上到下执行完毕后最后执行显示窗体的语句,这时窗体才会显示到屏幕上。
2.6.5 MDI窗体
MDI窗体是一种有父子关系的窗口。在绝大多数应用程序中,编程人员通常都要建立一个标准的“主”窗体,用户在其中完成几乎所有的工作。有时,还要添加一些特殊用途的窗体用来处理程序的输入和输出。其实,Visual Basic支持层次结构,这种结构是程序中的多个窗体一起工作时所表现的一种特殊关系。这种特殊的窗体称作MDI(多文档界面)窗体。由于作用不同,将MDI窗体分为了父窗体和子窗体。在“工程”菜单中选择“添加MDI窗体”菜单项,可以创建MDI父窗体。如果要创建子窗体,首先,在“工程”菜单中选择“添加窗体”菜单项,然后将添加进来的新窗体的MDIChild属性设置为True。除下列情况外,MDI窗体和普通窗体在运行时的行为相同。
❑所有的子窗体都在其父窗体的窗口中显示。
❑当将一个子窗体最小化时,它不是变成任务栏上的一个按钮,而是缩小为MDI窗体上的一个小标题条。
❑当将一个父窗体最小化时,该父窗体和其所有子窗体都变为任务栏上的一个按钮。
❑所有子窗体菜单都在其父窗体菜单上显示。当最大化子窗体时,其标题显示在其父窗体的标题栏中。
当将某个父窗体的AutoShowChildren属性设置为True,就可以显示其所有的子窗体。父窗体和子窗体在所谓的“以文档为中心的应用”中特别有用,在这种应用程序中,通常同时使用多个窗口来显示或编辑文档。其实,Visual Basic6.0本身就是很好的一个MDI窗体应用例子。本书第23章的综合实例也用到了MDI窗体。