第7章 应用程序的脸—窗体和系统对象

本章视频教学录像:1小时5分钟

窗体是应用程序直接与用户交互的主要界面,是应用程序最重要的一部分,所以窗体的设计显得尤为重要。具有相同功能的两个应用程序,良好的窗体设计会给用户带来更好的使用体验。

本章将一步步带领读者熟悉窗体的相关概念及属性,掌握窗体设计的基本方法,以及学会设计多窗体应用程序。

本章要点(已掌握的在方框中打钩)

□ 熟悉窗体的基本概念

□ 熟悉窗体的属性、事件和方法

□ 掌握窗体的启动和结束

□ 了解多窗体设计

□ 了解多窗体特性

7.1 窗体简介

本节视频教学录像:5分钟

图形界面的Windows操作系统诞生以来,软件的编写又多了一项重要部分——用户界面的设计。设计良好的软件界面能够让用户感觉舒适并易于使用。在Visual Basic的软件设计中,好的窗体设计是成功的一半。

7.1.1 窗体的基本概念

我们日常使用的Windows操作系统又称为视窗操作系统,它是由一个个窗体所组成的。我们对计算机的所有操作几乎都是通过各种窗体来完成的,所以窗体既是我们完成各种计算机操作的载体,又是我们与计算机进行沟通的主要方式。一个优秀软件的界面设计是非常重要的。在Visual Basic中要设计一个窗体,首先要了解的概念是它的属性、事件和方法。

提示

Windows在英文中的原意是“窗户、视窗”。在Windows系统诞生之前,计算机上看到的只是枯燥的字幕数字(DOS),微软公司开发的Windows操作系统,打开了用户与计算机之间交流的“视窗”,使我们能够以更加直观和方便的方式使用计算机。

打开Visual Basic并新建一个工程后,在打开的界面上就会加载一个默认窗体,我们把各种需要的控件放在这个窗体上并编写每个控件的代码,即可完成应用程序设计。

7.1.2 在工程中添加窗体的方法

大部分的软件都拥有多个窗口,因此仅有默认的窗体是不够的。如果需要创建更多的窗体,可以使用以下两种方法。

⑴ 选择【工程】【添加窗体】菜单命令。

⑵ 在工程资源管理器窗口中右击,在弹出的快捷菜单中选择【添加】【添加窗体】菜单命令。

不管使用哪种方式,都会打开【添加窗体】对话框,从中选择需要的窗体类型,然后单击【打开】按钮,即可将该窗体添加到工程中。

提示

根据窗体的功能,可以将窗体分为单文档窗体(SDI)和多文档窗体(MDI)。每个单文档窗体均是一个独立的窗口,而每个多文档窗体中可以包含多个窗口。

7.2 控制窗体表情—窗体的属性、方法和事件

本节视频教学录像:18分钟

创建出窗体后,接下来需要根据软件设计的需要对这个窗体的各种属性进行设置。可以直接在程序源代码中编写和修改窗体的属性,但是更常用和方便的方法是通过属性窗口设置。

7.2.1 窗体的属性

下面介绍一些最常用的窗口属性的意义和设置方法。

1. 标题属性(Caption)

标题属性就是用来设置窗体标题所显示的文字的。标题属性既可以通过代码来设置,也可以直接在属性窗口中设置。

在代码中设置标题属性的语法是:

        窗体名.Caption="String"

其中String就是希望标题所显示的文字。

在属性窗口中的设置更为简单:直接在属性窗口中的Caption属性所对应的输入框中输入字符即可。

例如有一个窗体Form1,要设置窗体标题为“Hello!”,则可在属性窗口中设置Caption值为“Hello!”。

设置完成,按【F5】快捷键运行程序,实际效果如下图所示。

提示

使用这两种方法都可以设置窗口的标题,实际运用中应根据不同情况使用不同的方法。对于在运行中不需要改变标题的窗口,可以采用第2种方法;而对于需要在运行中更改标题的窗口,则应该使用第1种方法。

2. 外观属性(Appearance)

外观属性中只有两个选项,分别是Flat和3D,Flat的意思是“平的”,而3D则是常见的三维立体效果。

对比可见,3D属性的立体感更强一些。外观属性的设置和标题属性的设置类似,直接在属性窗口中选择相应的属性即可。

3. 边框样式属性(BorderStyle)

边框样式属性决定了窗体的边框外观和功能。可以通过属性窗口来对其边框样式进行设置。

可以看到,边框样式属性拥有6个选项,含义如表所示。

4. ControlBox属性

ControlBox属性用于设置窗体是否显示控制菜单和【最大化】、【最小化】以及【关闭】等按钮。当ControlBox属性为True时,将显示控制菜单和【最大化】、【最小化】以及【关闭】等按钮;为False时不显示。

提示

在Windows操作系统中,每个应用程序都有一个控制菜单,提供还原、移动、调整大小、最大化、最小化和关闭窗口等功能。

右击标题栏的任意位置,或单击标题栏左侧的图标,都可以弹出控制菜单。同时按住【Alt+空格】键也可以弹出控制菜单。同一程序的控制菜单具有相同的菜单命令。

对ControlBox的属性可以通过属性窗口来设置。

5. 最大化按钮属性(MaxButton)

最大化按钮属性决定最大化按钮是否起作用。

⑴ 当最大化按钮属性为True时,最大化按钮高亮度显示,单击可以使窗口最大化。

⑵ 当最大化按钮属性为False时,最大化按钮低亮度显示,单击不能使窗口最大化。

对MaxButton的属性可以通过属性窗口来设置。

6. 最小化按钮属性(MinButton)

该属性决定最小化按钮是否起作用。

⑴ 当最小化按钮属性为True时,最小化按钮高亮度显示,单击可以使窗口最小化。

⑵ 当最小化按钮属性为False时,最小化按钮低亮度显示,单击不能使窗口最小化。

可以通过属性窗口来设置最小化按钮属性。

提示

如果想显示最小化按钮,必须将BorderStyle属性值设置为1或者2。这样程序运行时,窗体最小化后,窗体最小化显示为图标。

7. 可见属性(Visible)

该属性决定窗体或者窗体上的控件在运行时是否可见。当可见属性为True时,程序运行后将显示该窗体或控件;当可见属性为False时,程序运行后将不会显示该窗体或者控件。可以通过属性窗口来设置可见属性。

8. 图标属性(Icon)

通过设置该属性可以改变窗体最小化时所显示的图标,该图标也将显示在窗体标题栏左侧。可以通过属性窗口来设置图标属性。

如果你没有设置图标也没有关系,Visual Basic 6.0将为其设置一个默认图标:。但如果所有的应用程序都采用这种默认的图标,那么在较多的程序中找到需要的窗口就很不方便,所以应该适当地为程序指定意义鲜明的图标。

提示

对于窗体的属性,可以实际动手设置一下,看看选择不同的属性值后有什么不一样的地方,通过实际操作可以对这些属性值有更切身的感受。

7.2.2 窗体的方法

窗体的方法是指对窗体的各种操作,如“显示窗体”方法(Show)、“隐藏窗体”方法(Hide)、“移动窗体”方法(Move)、“显示弹出式菜单”方法(PopupForm)和“打印窗体”方法(PrintForm)等。现将常用的方法介绍如下。

1. “显示窗体”方法(Show)

“显示窗体”方法用来显示窗体,其语法格式如下。

      [Object].Show [Model],[OwnerForm]

其中,Object用于指定窗体对象,Model用于指定窗体是模式窗体还是无模式窗体。Model值为0时,窗体为无模式窗体;值为1时,窗体为模式窗体。

需要注意的是,模式窗体显示后一直占据焦点,其他窗体暂时不可用,所以使用模式窗体来实现多窗体有严格操作步骤的程序,如软件安装程序。

OwnerForm用于指定窗体对象,指定的窗体可以看作为Object窗体的父窗体。

提示

Object窗体始终位于指定窗体前面,且关闭或最小化OwnerForm窗体时,Object窗体也随之关闭或最小化。

2. “隐藏窗体”方法(Hide)

大部分的软件一般含有多个窗体,分别用于实现不同的功能。在很多时候并不需要显示所有的窗口,使用隐藏窗体功能可以为工作区域节省很多屏幕空间。

“隐藏窗体”方法用于隐藏窗体但不关闭窗体,其语法格式如下。

      [Object].Hide 'Object用于指定窗体对象

7.2.3 窗体的事件

事件驱动的编程机制是Visual Basic的一大特点。窗体中提供有很多的事件来表达各种触发条件,如表所示。

例如:有一个窗体Form1,要在加载窗体时设置窗体标题为“此窗体已加载”,则可添加如下代码。

        01 Private Sub Form_Load()  '窗体加载事件
        02   Form1.Caption="此窗体已加载"'设置From1的Caption值
        03 End Sub

程序运行效果如图所示。

7.3 窗体的生命周 期

本节视频教学录像:7分钟

窗体的启动、运行和关闭,是窗体由“生”到“亡”的一个生命周期。下面就来了解一下窗体的“一生”过程。

7.3.1 选择启动窗体

当我们建立一个应用程序的时候,应用程序中的第1个窗体默认被指定为启动窗体。应用程序开始运行时,这个窗体就会显示出来。可以通过改变启动窗体来使其他窗体在启动时显示出来,操作步骤如下。

⑴ 选择【工程】【属性】菜单命令,弹出【工程属性】对话框。

⑵ 在【通用】选项卡中的【启动对象】下拉列表中,选取要作为启动窗体的窗体。

⑶ 单击【确定】按钮,即可完成更改启动窗体的操作。

注意

选择的启动对象一定要是已经存在的,如果选择了不存在的启动对象,在编译运行时会出错,并弹出【工程属性】对话框,要求重新选择启动对象。

7.3.2 快速显示窗体

如果启动时有一个较长的执行过程,例如要从数据库中装入大量的数据,或者要装入一些大型位图,这时如果能够提供一个快速显示窗体,将会消除用户等待时的焦急感并了解一些软件使用信息。

技巧

快速显示是一种窗体,它通常显示的是应用程序名、版权信息或者一个简单的位图之类的内容。启动Word 2007时所显示的屏幕就是一个快速显示。

要显示快速显示窗体,需要用Sub Main过程作为启动对象,并用Show方法显示该窗体。

        01 Private Sub Main()
        02   frmSplash.Show       '显示快速显示
        03   ...    '在此处添加启动过程
        04   frmMain.Show  '显示主窗体并卸载快速显示
        05   Unload frmSplash
        06 End Sub

启动过程完成,可以装入第1个窗体并使快速显示卸载。

7.3.3 结束窗体

在很多人的印象里,当一个应用程序的所有窗体都关闭的时候,就意味着这个程序停止运行了。

然而事实并非如此,很多程序虽然没有任何窗体显示了,但是在后台仍然默默地运行着。出现这种情况的原因是对任何已卸载窗体的属性或控件的任何访问,都将导致隐含地、不予显示地加载那个窗体。

为了保证在关闭所有的窗体后程序确实已经停止运行,最好的办法是确保所有的窗体都已被卸载。如果应用程序只有一个窗体,则在主窗体上可以用一个名为cmdQuit的命令按钮退出程序,Click事件过程代码如下。

        01 Private Sub cmdQuit_Click()
        02   Unload Me    '卸载窗体
        03 End Sub

如果有1个以上的窗体,可以使用Forms集合和Unload语句,通过把代码放入主窗体的Unload事件过程卸载这些窗体。

通过使用Forms集合可以确保找到并关闭所有窗体。下列代码就是使用窗体集合来卸载所有窗体的。

        01 Private Sub Form_Unload(Cancel As lnteger)
        02   Dim i as integer
        03   For i=Forms.Count-1 to 0 Step-1     '在窗体集合中遍历并卸载每个窗体
        04    Unload Forms(i)
        05  Next
        06 End Sub

有的时候我们需要不顾现存窗体或对象的状态而强制结束应用程序,此时可以使用Visual Basic中的End语句。

End语句用于使应用程序立即结束。在End语句之后的代码不会执行,任何窗体的QueryUnload、Unload或Terminate等事件过程也不会被执行,对象的各个引用将被释放,也不会再有事件发生。

7.4 多窗体设计

本节视频教学录像:5分钟

多文档界面(Multiple Document Interface,MDI)和单文档界面(Single Document Interface,SDI)是Windows应用程序最为常见的两种结构。MDI是在一个应用程序中能够同时处理两个或者两个以上窗体的界面形式,利用鼠标单击某个文档,该文档则成为活动文档,也称多文档程序。

技巧

多文档界面和单文档界面的不同之处在于:SDI中的各个窗体是相互独立的,例如IE浏览器;而MDI中的窗体则有主从关系,例如Excel软件。

7.4.1 创建多窗体应用程序

创建MDI应用程序,首先要在工程中创建一个MDI窗体,然后在这个MDI窗体中创建多个子窗体。具体的操作步骤如下。

⑴ 启动Visual Basic 6.0,在弹出的【新建工程】对话框中选择【标准EXE】图标,然后单击【打开】按钮。

⑵ 选择【工程】下拉菜单中的【添加MDI窗体】选项,弹出【添加MDI窗体】对话框,从中选择新建或者现存的MDI窗体,在这里选择新建MDI窗体,然后单击【打开】按钮。

⑶ 弹出一个颜色为深褐色的名为MDIForm1的新窗体。

⑷ 选择Form1窗体,将属性窗口中的MDIChild属性设置为【True】,即将Form1窗体设置为MDIForm1窗体的子窗体。

⑸ 运行程序,Form1窗体已经在MDIForm1窗体中了。

7.4.2 多窗体特性

多窗体工程中的子窗体具有以下一些特性。

⑴ 所有子窗体均只在主窗体的内部显示,用户在主窗体中可以任意地移动和改变子窗体的大小,但是不能将子窗体移动到主窗体之外。

⑵ 子窗体最小化后,其图标将出现在主窗体的最下方,而不是出现在用户桌面上。

⑶ 子窗体未最大化时,各个子窗体具有自己的标题。

⑷ 最大化后,子窗体的标题将和主窗体的标题合并,并在主标题栏中显示出来。

7.5 登录窗体设计实例

本节视频教学录像:15分钟

本节通过一个实例来加深对窗体程序设计的理解。

【范例7-1】 用户登录界面设计,实例运行后将显示类似软件登录界面的效果,输入正确的用户名和密码后,即可显示主窗体;如果用户名和密码不正确,将显示警告窗口,要求重新输入。

⑴ 启动Visual Basic 6.0,在弹出的【新建工程】对话框中选择【标准EXE】图标,然后单击【打开】按钮。

⑵ 将Form1的Caption属性改为“用户登录”。

⑶ 在窗体中添加两个Command Button控件、两个Label控件和两个TextBox控件。属性设置如表所示。

⑷ 选择【工程】菜单下的【添加窗体】菜单项,在弹出的【添加窗体】对话框中选择【窗体】为工程添加一个窗体Form2。

⑸ 更改Form2的Caption属性为“系统主界面”,ControlBox属性值为“False”。在Form2中添加文本框控件,设置该控件的【名称】属性为“Txt1”,Text属性值为“欢迎你进入系统”;添加命令按钮控件,设置该控件的【名称】属性为“Cmd3”,Caption属性值为“退出”。将Form2中的控件拖动到合适位置并调整大小。

⑹ 双击Form1窗体空白处,在弹出的代码窗口中输入以下代码(代码7-1-1.txt)。

        01 Private Sub Form_Load()  '窗体1加载事件代码
        02  Form1.Show
        03  Form2.Hide
        04 End Sub
        05 Private Sub Txt1_KeyDown(KeyCode As lnteger,Shift As lnteger)
            '用户名文本框KeyDown事件代码
        06  lf Txt1.Text="user"And KeyCode=vbKeyReturn Then
            '若用户名文本框输入正确且Enter键被按下
        07   Txt2.SetFocus '密码文本框激活
        08  Elself Txt1.Text<>"user"And KeyCode=vbKeyReturn Then '若用户名文本框输入不正确
        09   MsgBox"请输入正确的用户名!",vbOKOnly+vblnformation,"注意"       '显示警告窗口
        10  End lf
        11 End Sub
        12 Private Sub Txt2_KeyDown(KeyCode As lnteger,Shift As lnteger)
            '密码文本框KeyDown事件代码
        13 lf Txt2.Text="123456"And KeyCode=vbKeyReturn Then
            '若密码文本框输入正确且Enter键被按下
        14   Form1.Hide    '窗体1隐藏
        15   Form2.Show
        16   Elself Txt2.Text<>"123456"And KeyCode=vbKeyReturn Then
            '若密码文本框输入不正确
        17   MsgBox"请输入正确的密码!",vbOKOnly+vblnformation,"注意"  '显示警告窗口
        18 End lf
        19 End Sub

⑺ 双击Form1窗体中的【确定】按钮控件,在弹出的代码窗口中输入以下代码(代码7-1-2.txt)。

        01 Private Sub Cmd1_Click() '确定按钮鼠标单击事件代码
        02  lf Txt1.Text="user"Then '若用户名文本框输入正确
        03   Txt2.SetFocus '密码文本框激活
        04  Elself Txt1.Text<>"user"Then    '若用户名文本框输入不正确
        05    MsgBox"请输入正确的用户名!",vbOKOnly+vblnformation,"注意"      '显示警告窗口
        06  End lf
        07  lf Txt2.Text="123456"Then      '若密码文本框输入正确
        08   Form1.Hide    '窗体1隐藏
        09   Form2.Show   '窗体2显示
        10 Elself Txt2.Text<>"123456"Then  '若密码文本框输入不正确
        11   MsgBox"请输入正确的密码!",vbOKOnly+vblnformation,"注意"  '显示警告窗口
        12  End lf
        13 End Sub

⑻ 双击Form1中的【取消】按钮控件,在弹出的代码窗口中输入以下代码。

        01 Private Sub Cmd2_Click() '取消按钮鼠标单击事件代码
        02  End   '退出程序
        03 End Sub

⑼ 双击Form2中的【退出】按钮控件,在弹出的代码窗口中输入以下代码。

        01 Private Sub Cmd3_Click() '退出按钮鼠标单击事件代码
        02  End   '退出程序
        03 End Sub

【代码详解】

在第⑹步代码中,Form1.Show用于显示Form1,Form2.Hide用于隐藏Form2。

在第⑺步代码中用If判断函数来判断输入的用户名及密码是否正确,如果正确则显示Form2,如果不正确则弹出警告窗口提示“请输入正确的用户名!”及“请输入正确的密码!”。

第⑻及第⑼步则是为Form1中的【取消】按钮控件及Form2中的【退出】按钮控件添加结束程序语句。

【运行结果】

单击工具栏中的【启动】按钮,即可看到程序运行结果。

【范例分析】

通过本例,我们学习了在工程中添加窗体、在窗体中添加不同控件、改变窗体外观、控制窗体的显示与隐藏等方法。

【拓展训练7-1】 用户登录界面设计2。

在【范例7-1】中,在关闭系统主界面后直接退出程序,如果想单击【退出】按钮后,再返回到用户登录界面中,应该怎么办呢?

只需修改Form2中的【退出】按钮为如下代码就可以实现。

        01 Private Sub Cmd3_Click() '退出按钮鼠标单击事件代码
        02   Form1.Show  '窗体1显示
        03   Unload Me    '卸载窗体
        04 End Sub

这样,单击【退出】按钮后,Form1窗体将显示,而Form2窗体将隐藏。

7.6 系统对象

本节视频教学录像:12分钟

系统对象指的Visual Basic提供的内置对象,主要包括App对象、Clipboard对象、Screen对象、Printer对象等,能够在Visual Basic 6.0中被随时调用,完成一定的功能。本小节将对几种常用系统对象进行详细介绍。

7.6.1 应用程序APP对象

App对象是通过关键字App访问的全局对象。其提供了十多个属性,包括应用程序的标题、版本信息、可执行文件和帮助文件的路径及名称以及是否运行前一个应用程序的示例。App对象的主要属性如表所示。

其中,App对象的两种重要属性App.Path和App.EXEName应用较多。App.Path在Visual Basic编程状态下返回.MAK文件所在目录;在以.EXE文件运行时,则返回.EXE文件所在目录。App. EXEName返回程序名。

App对象的典型应用在实现相对路径上。在Visual Basic中,程序总是按编程时固定好的路径读写文件,但文件路径改变,程序就找不到路径了,因此不能正常写文件。

7.6.2 屏幕Screen对象

Screen对象指的是整个Windows桌面。Screen对象可以访问当前窗体、控件以及其他与屏幕相关的信息。如屏幕鼠标指针的修改。下表为Screen对象的常见属性。

例如实现在系统字体中搜索Arial字体,找到后给出提示。设计结果如下。

在窗体上添加图片框Picturel和时钟Timer1控件,将其Interval属性设置为1000,双击图片框Picturel编写代码如下。

        01 Private Sub Timer1_Timer()           '定时器的Timer事件
        02 Static screenfontscount As lnteger
        03 lf screenfontscount<Screen.FontCount Then
        04 Screen.ActiveControl,Cls            '调用方法清除屏幕
        05 Screen.ActiveControl.Print Screen.Fonts(screenfontscount)'调用方法显示字体
        06 lf Trim(Screen.Fonts(screenfontscount))="Arial"Then
        07 Timer1.Enabled=False              '停止搜索
        08 MsgBox"这是我要选择的字体"          '给出提示
        09 Exit Sub                    '退出程序
        10 End lf
        11 screenfontscount=screenfontscount+1          '循环变量加1
        12 End lf
        13 End Sub

Timer控件在后续章节会详细讲解。设置其Interval属性为1000,即设置其每过1000毫秒执行一次其中的代码。运行上述示例。其结果如下图所示。其中,Picturel控件中的字体名称一直会变化,直到找到Arial字体为止,找到后,显示如下的提示信息。

7.6.3 剪贴片Clipboard对象

Clipboard对象用于操作剪贴板加上的文本和图形,它使用户能够复制、剪切和粘贴应用程序中的文本和图形。该对象的常用方法如表所示。

例如,利用Clipboard对象将图片框Picture1中的图片粘贴到文本框Picture2中,将Clipboard对象中的文本粘贴到文本框Text1中。设计如图所示的窗体。

在Picture2控件的单击实践中输入代码如下。

        01 Private Sub Picture2-click()
        02 Clipboard.Clear        '清除Clipboard对象'
        03 Clipboard.SetData Picture1.picture '用指定图像格式将图片放到Clipboard对象上'
        04 Picture2=loadpicture("") '返回图片的位置'
        05 Picture2=Clipboard.GetData()  '从Clipboard对象返回一个图形'
        06 End sub

在Text1控件的单击事件中输入如下代码。

        01 Private Sub Text1-Click()
        02 Text1=Clipboard.GetText()    '返回Clipboard对象中的文本字符串'
        03 End Sub

运行该示例,当用户单击picture2控件时,其将Picture1控件中的对象复制到Picture2控件中。

示例运行结果如下图所示。

7.6.4 调试Debug对象

Debug是一个隐藏的对象,用于进行和调试相关的工作。在调试程序的时候使用Debug会很方便。比如Debug.Print a会在VB界面下方的“立即”窗口中显示出a的值,这样你就不必修改程序的界面来显示a或者中断程序来查看a。再比如当你在某处需要a>5的时候,你可以加一句Debug.Assert(a>5),当a<=5的时候程序执行到此处就会暂停,然后你就可以查看a为何没有满足a>5的条件,从而找到代码错误。

Debug的一个重要优点是,当你把程序编译成成品EXE之后,这些Debug语句都被剔除,也就是说你在程序中加入Debug语句并不会影响最终成品的效率和界面。Debug只是为调试人员存在的。

7.7 高手点拨

本节视频教学录像:3分钟

1. Form_Activate

当一个对象成为活动窗口时发生,使用此过程请注意一下,如果在一个多窗体的程序中,例如,Form1中从慢点Command1按钮Form2.Show的话,并且Form2的Borderstyle属性为0,3,4,5中之一的值的话,千万不要再在这个过程里面加入MsgBox函数,要不然就会反复地弹出对话框。如果再在form1中的这个过程中加入MsgBox的话那就更热闹了,因为在MsgBox点击确定后会执行Form_Activate过程。

2. Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)

发生于Form_Unload之前,多一个可以判别结束方式的变量。

UnloadMode值的含义如下表所示。

如果用于MDI窗口中并且直接关闭parent窗口时,过程顺序如下。

⑴ parent.QueryUnload

⑵ child.QueryUnload

⑶ child.Unload

⑷ parent.Unload

只要子窗体被Load,都会执行Child的QueryUnload,Unload过程。

3. 另外一种窗体打开方式

一般的打开方式就是Form1.Show或者是Form1.Visible = True。但是如果在打开某个窗体前使用窗体的属性时,就会产生Load事件,如果在Load里面在自己Show一下就显示出来了。不同打开方式的结果列表如下。

        Private Sub Command1_Click()
        Form2.Show '依次执行Form_Initialize,Form_Load,Form_Activate
        End Sub
        Private Sub Command2_Click()
        Form2.Visible = True '依次执行Form_Initialize,Form_Load,Form_Activate
        End Sub
        Private Sub Command3_Click()
        Form2.Visible = False '依次执行Form_Initialize,Form_Load,不显示窗口
        End Sub
        Private Sub Command4_Click()
        Form2.Left = 0 '依次执行Form_Initialize,Form_Load,不显示窗口
        End Sub

第一次打开窗口后,如果Unload时不写代码Set Form1 = Nothing,那么在此打开时会不执行Form_Initialize过程。

如果窗体已经显示,那么Form2.Visible = True是不能激活Form_Activate过程的,而Form2.Show却可以。

还有如果是MDI文档的子窗体,在用Show或者Visible方法时都是不会执行Form_Activate过程的。

7.8 实战练习

一、思考题

1. 列举窗体的3个主要属性及其作用。

2. 单窗体应用程序和多窗体应用程序有什么不同?

二、操作题

在Visual Basic 6.0中设计一个单窗体应用程序,完成以下功能。

⑴ 窗体名称为“Form1”,标题为“显示与删除”,最小化按钮可用,最大化按钮不可用。

⑵ 在窗体中添加一个名称为Cmd1,标题为“显示”的命令按钮。

⑶ 如果单击命令按钮,则执行语句Form1.Print"显示";如果单击窗体,则执行语句Form1.Cls。