1.4 第一个可视化vb.net程序

来源:百度文库 编辑:神马文学网 时间:2024/04/29 05:14:40

上一节中用记事本编辑源代码,并使用vbc编译器编译生成了第一个.NET程序HelloVB。但这个程序只是向命令提示窗口输出一个简单的英文字符串,没有属于自己的窗体,除了用来展示.NET编程的步骤,并无多大用处。

常见的有着漂亮界面的各种程序是怎么做出来的?在本节中将通过使用VS .NET开发一个“数字时钟”实例,展示开发具有Windows用户界面的.NET程序的方法。

启动VS .NET,从菜单中选择:

文件→新建→项目

如图1-30所示。

图1-30 新建一个Windows应用程序

在左边窗体中选择“Visual Basic项目”,在右边窗体中选择“Windows应用程序”这一模板,在名称处输入“MyClock”。这样做的含义是生成一个运行后有着独立窗体的Windows应用程序,并使用VB.NET语言,此程序在编译之后的文件名为“MyClock.exe”。

 注意

更严格地说,MyClock是VB.NET项目的名字,并不是生成的EXE文件的名字,但除非您特别指定,否则VS .NET会用项目名字生成可执行的程序文件。

设置完以上选项后,单击【确定】按钮,VS .NET将创建项目框架(如图1-31所示)。

从图1-31中可以看到,VS .NET自动生成了一个窗体,放置在屏幕的中央。左边的许多小图标代表Windows窗体上常见的各种控件,这些控件都可以被拖放到窗体上。右边分成两个窗体,上半部分称为“解决方案资源管理器”,下半部分为属性窗口,其中可以设置放置在窗体上的控件的属性。

图1-31 VS .NET生成的项目框架

“解决方案资源管理器”中列出了项目的文件清单,以一棵树的形式表示,在树节点中双击文件名,就可以在中间的大窗口中看到相应的内容。

 试一试

双击“解决方案资源管理器”项目树中的“AssemblyInfo.vb”节点,看到了什么?

再双击“Form1.vb”节点,又看到了什么?

从“生成”菜单中选择“生成解决方案”,则VS .NET会自动编译这一程序,可以从VS .NET下部的“输出”窗口(如图1-32所示)中看到这一点。

单击工具栏上的  按钮,稍等片刻,一个标准的窗体将出现我们的面前,如图1-33所示。

 

图1-32 编译项目 图1-33 生成的“标准窗体”

单击窗体的关闭按钮可回到VS.NET集成开发环境。

让我们看看都发生了什么事。

注意到前面在“新建项目”对话框中设定项目所在的位置为:“D:\MyClock”,可以在“资源管理器”中打开这一文件夹看看里面都有哪些内容,如图1-34所示。

图1-34 项目文件夹

从图1-34中看到,所有的项目文件都存放在D:\MyClock下。特别注意以下几个文件。

— MyClock.vbproj:这是VB.NET的项目文件,在其中列出了项目属性和所有的文件清单(您要是好奇的话,请用记事本打开这个文件,找到这个标记,就可以看到项目中的文件清单了)。

— MyClock.sln:这是解决方案文件,可以把解决方案看成是多个项目的集合。目前示例的解决方案都只包含一个项目,第12章将看到多项目解决方案的例子。

要注意区分项目与解决方案这两个概念。

项目是进行编译的最基本组成单位,单个的程序源代码文件可以被VS .NET所打开,但无法编译,工具栏上的【编译并运行】按钮是灰色的,不可用。要想编译一个程序源代码文件,必须把它包含进一个项目中。

 提示

在“项目”菜单中选择“添加现有项…”命令,可以把一个程序源代码文件加入项目中以便编译。

向项目中添加文件并不会导致源文件被删除,VS .NET会自动地将源文件复制一份,并拷贝到项目文件夹中。

— Form1.vb和Form1.resx:这两个文件是Windows窗体的必要文件,其中Form1.vb文件存放的是程序源代码。每个Windows窗体都由这两个文件组成。

 提示

(1)当手动备份窗体时(不使用VS .NET),务必记住要把这两个文件一块复制。

(2)通过VS .NET“项目”菜单中选择“添加现有项…”命令将一个窗体加入到项目中时,可以只指定“.vb”文件,VS .NET会自动将“.resx”文件一并复制并拷贝到项目文件夹中。

打开“bin”文件夹(参见图1-35),看到了什么?

图1-35 生成的可执行程序文件

原来VS .NET把生成的可执行程序放到了这个文件夹下。试着双击“MyClock.exe”,一个熟悉的窗体将出现在面前。

简单吧?到目前为止,甚至还没写过一句代码!VS .NET把原来复杂的工作变得如此轻松和高效!

 提示

有些眼尖的读者可能会发现图1-35中有一个灰色的“MyClock.pdb”文件,这是干什么的?其实,这个文件是VS .NET在编译过程中生成的中间文件,您可以把它删除,并不影响程序的运行。不过,即使您在“资源管理器”中把它给删除了,只要用VS .NET再次编译,就会发现这个文件“阴魂不散”地又出现了,因为VS .NET会在每次编译源程序时重建此文件。

下面写一些代码让计算机干些事情。

第一个问题:VS .NET中那么多的窗口和按钮,让人眼花缭乱,如果读者以前很少使用集成开发环境编程,可能会问:“我的代码往哪儿写啊?”

请注意右边的“解决方案资源管理器”窗口(如图1-36所示)上方有一排按钮,当鼠标移过去时会弹出一个小小的黄色标签说明其用途。

 提示

这种在许多软件中都可以见到的小标签称为“Tip”,可以使用工具箱中的ToolTip控件给按钮等界面控件加上这种小标签。

在树中选中Form1.vb节点,窗口上方的按钮变为5个,单击最左边的  按钮,则在窗体中部的“窗体设计”窗口变成了“代码编辑”窗口,如图1-37所示。

 

图1-36 解决方案资源管理器 图1-37 代码编辑器

现在可以输入代码了。

在代码编辑器中左边“Winodws窗体设计器生成的代码”旁边有一个加号,单击它可以展开其中所包含的代码,再次单击则又把这些代码收缩为一行,这就是非常受到程序员欢迎的“代码折叠”功能。

 试一试

在代码编辑器中输入以下代码:

#region"这是一个可以折叠的代码区域"

回车,看看发生了什么?

在继续下面的内容之前,删除您输入的所有内容,还原到初始状态。

在代码编辑器上部还有两个组合框,左边列出了“Form1.vb”中声明的所有对象,右边的组合框则依据左边所选择的对象列出这一对象的方法和事件清单。

 试一试

在代码编辑器上部左边的组合框中选中“(Form1 Events)”,在右边的组合框中选“Click”,看看发生了什么?

在继续下面的内容之前,将代码编辑器还原到初始状态。

有关对象、方法、事件等编写代码的概念,将在第2章中进行详细介绍。

那么,如何从代码编辑视图切换回窗体设计视图呢?有两个方法:

(1)在“解决方案资源管理器”窗口中双击“Form1.vb”节点。

(2)在“解决方案资源管理器”窗口上排的按钮中单击  按钮(左数第2个)。

现在,双击“Form1.vb”节点回到窗体视图,开始设计用户界面。

在左边的工具箱窗口中确定展开了“Windows窗体”面板,在其中单击选中标有“Label”字样的控件,将鼠标移到窗体设计器中的窗体上,鼠标指针将变成一个字母“A”的形状。在窗体上拖动画出一个方框,松开鼠标,一个标签控件就放在了窗体上,并在其四周出现了8个小方块,拖动这些方块可以改变标签的大小。

从工具箱中选取控件,将其放到窗体上以生成最终用户可视的界面,这就是现代软件开发技术中的“可视化界面设计”,它是目前专业的软件集成开发环境中必需的组成部分。这种所见即所得的用户界面设计方式,极大地提高了软件开发效率。

 扩充阅读

在可视化开发工具出现之前,要设计可视化的界面是非常复杂与麻烦的。拿一个Windows程序来说,如果仅用C语言实现一个空白窗体的功能,就需要写几百行代码,更别说要在上面加上各种各样的控件了。VB的出现改变了这一痛苦的过程,它第一次使Windows编程变得如此简单,简单到只需拖动一两次鼠标就可生成一个应用程序,从而对Windows软件开发技术产生了深远的影响。在短短几年之内,全世界的Windows程序员从几十万人上升到数百万人,后来的Delphi、JBuilder等集成开发环境无不采用了VB这种所见即所得的用户界面设计思想。现在,不具备可视化用户界面设计器的软件集成开发环境已没有人用了。

 试一试

从工具箱中再选其他几个控件,拖动到窗体上,然后,编译并运行程序。之后,回到窗体设计器,用鼠标单击选中这些控件,按Del键删除它们(保留第一次加入窗体的Label控件)。

现在,再从Windows窗体控件中选择一个小闹钟(Timer控件),将其拖动到窗体上。您会发现这个控件并没在待在窗体上,而是跑到了窗体下面,参见图1-38。

从图1-38可以发现Timer控件与Label控件的不同之处,后者是可视化的控件,而前者是不可视的控件,不可视的控件不在窗体上出现,而是集中放置在窗体设计器的下部。

现在让我们把Label的字体改大些,颜色改为蓝色。

单击选中图1-38中的Label1控件(在Label1控件周围会出现8个小方块),在屏幕右下角的属性设置窗口中找到“Font”属性,单击它,则在右边会出现一个标有省略号的按钮,单击它可以设置字体(设为宋体二号字),参见图1-39。

 

图1-38 不可视控件 图1-39 设置字体

再在属性窗口中设置“ForeColor”属性为蓝色(单击展开ForeColor组合框,在“自定义”卡片上可以设置颜色)。

接着,设置Text属性为“当前时间:00:00:00”。

您可能会发现窗体上的标签变成了两行,这时可以手动调整其大小以在一行显示,接着再调整窗体的大小以使文本在窗体中居中显示。

 小技巧

设置Label控件的AutoSize属性为True,则Label控件会自动根据其内容长度进行缩放。

把Label控件的Name属性由原来的“Label1”改为“lblTime”。其中,“lbl”是前缀,表明这是一个标签,“Time”则表明它的用途是显示时间。

 注意

在软件开发过程中,给对象取名是非常重要的。不要采用开发环境默认提供的名字,而应采用有意义的名字。对于控件来说,一般采用“控件类型缩写”+“控件用途说明”的方式。例如:txtSetPassword代表一个用于输入密码的文本框。控件类型缩写一般小写,而控件用途说明可以是几个单词,首字母大写。在后面还会看到更多的例子。在本书的附录中列出了推荐的控件变量命名方法。

现在给Timer控件设置属性。单击选中Timer控件,在属性窗口中设置其Enabled属性为True。这将让时钟“走”起来(Enabled为False时,时钟“停”)。

接着,设置窗体对象的属性,单击窗体背景,在属性窗口设置其Text属性为“我的时钟”,Name属性为“frmTimer”,注意前缀“frm”代表“Form”。

至此,完成了对于控件属性的设置工作。

接着,在窗体设计器中双击Timer控件,VS.NET自动切换到代码视图,并出现以下框架代码:

Private Sub Timer1_Tick(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Timer1.Tick

End Sub

也可以用以下方式实现:

先切换到代码编辑视图,然后从代码编辑器左上方的组合框中选择“Timer1”,右边组合框中选择“Tick”。

输入以下代码:

lblTime.Text = "当前时间:" & TimeString

编码结果如图1-40所示。

现在编译并运行程序,参见图1-41。

 

图1-40 编写代码 图1-41 编译错误

图1-41报告发生了一个错误,其原因是主窗体的名字在前面由“Form1”改为了“frmTimer”。

更正方法如下:

双击图1-41中的“在‘MyClock.Form1’中未找到…”这一行,将出现图1-42所示的窗体。

选中“MyClock.frmTimer”这一项,单击【确定】按钮。

现在再编译运行就没问题了。程序运行结果如图1-43所示。

 

图1-42 设置启动对象 图1-43 程序运行结果

例子完成了,现在解释一下所写的代码。

整个程序一共只输入了一行代码:

lblTime.Text = "当前时间:" & TimeString

上述代码中,TimeString是VB.NET提供的一个内部函数(在VB.NET的所有项目中都可以直接使用),它可以取出当前计算机上的时间。执行TimeString函数将得到一个时间值,将其与字符串“当前时间:”连接在一起形成一个新的字符串,如下所示:

当前时间:12:11:59

再看一下VS .NET自动生成的框架代码:

Private Sub Timer1_Tick(ByVal sender As System.Object, _

ByVal e As System.EventArgs) Handles Timer1.Tick

End Sub

在VB中,以Sub和End Sub包围的代码称为“Sub过程”。注意过程名为“Timer1_Tick”,其中Timer1是控件名称,Tick是事件名称。事件在一定的条件下会被激发,对这个事件感兴趣的外界可以针对这个事件进行响应。

拿本例来说,时钟控件Timer1一直在走,每经过一个特定的时间间隔(由它的Interval属性决定),它会激发一个Tick事件,表明预先规定的时间到了。在这个事件中,可以更新窗体上显示的文本。

在Sub Timer1_Tick(…)之后有一句:

Handles Timer1.Tick

表明此Sub过程响应Timer1的Tick事件。换句话说,也就是时钟控件Timer1每走一定的时间,就会激发一个Tick事件,这个事件会自动执行Sub Timer1_Tick()过程中所写的代码(在此过程中我们通过设置Label控件的Text属性显示当前时间)。

请记住以下结论:

无论在什么情况下,只要事件产生了,事先写好的事件处理代码就会自动运行。

注意到Timer1控件的Interval属性为100,这就意味着每100毫秒激发一次Tick事件,Sub Timer1_Tick()过程被自动调用一次。这正是实现数字时钟的关键所在。

 试一试

先别看解答,自己动手试试修改并运行程序,看到现象后再自己想想原因。

(1)把Timer1控件的Interval属性改为3000,再运行程序,会发生什么事?

(2)把Timer1控件的Enabled属性改为False,再运行程序,会发生什么事?

现象:

第一个练习中,读者会发现时间数字是按3秒一次的间隔“跳”动。

第二个练习中,时钟数字始终都显示“00:00:00”。

解答:

Interval属性改为3000后,时钟控件每3秒激发一次Tick事件,Sub Timer1_Tick()过程被调用,用TimeString取出当前时间并更新显示,所以时间数字每3秒“跳”一次。

Enabled属性改为False后,时钟控件就停了,自然不会激发Tick事件,Sub Timer1_Tick()过程不会被调用执行,所以,始终都显示“00:00:00”。

现在对本节内容进行一下小结。

在本节中介绍了开发一个可视化Windows应用程序的全过程,这部分内容非常重要,是进一步学习的基础,请务必理解与把握以下的要点。

(1)必须掌握VS .NET的基本使用方法,例如如何输入代码,如何编译和运行一个程序,如何设计一个窗体等等。

(2)理解控件、属性与事件,明白在VS .NET中开发一个Windows应用程序的基本步骤:

① 从工具箱中选取控件,拖动到窗体上;

② 单击选取不同的控件,通过属性窗口设置相应的属性;

③ 给某个控件的事件进行编码;

④ 编译并运行程序。

学完这一节,读者将会对使用VS .NET开发Windows应用程序有初步的了解,但光知道怎么做还不行,还得知道为什么要这样做。1.5节将介绍.NET程序的运行原理。

 扩充阅读

Sub Main()跑哪儿去了?

在1.3节中介绍过,Sub Main()过程是整个程序的入口点。可要是读者足够仔细的话,就会发现由VS .NET生成的Windows Form项目文件中找不到Sub Main()过程,这是怎么回事?

其实,Sub Main()过程还是存在的,只不过被VS .NET隐藏起来了。

作为启动的窗体,VS .NET会自动为其生成一个Sub Main()过程,如下所示:

Public Class Form1

Inherits System.Windows.Forms.Form

Shared Sub Main()

Application.Run(New Form1())

End Sub

'……其他代码

End Class

此过程是在编译VB.NET程序时自动加入的,并不会修改窗体的默认生成代码框架。