单元二 VB.NET编程基础
[学习目标]初步掌握Visual Studio.NET(简称VS.NET)集成开发环境及其基本使用;通过实例初步学会利用Visual Basic.NET(简称VB.NET)开发Windows应用程序的流程。理解解决方案、项目与项的含义,并了解利用解决方案及项目对开发进行管理的基本方法。掌握在VS.NET中获得帮助的方法。
尽管VB.NET是VB6.0的后续版本,但由于其是置于统一的.NET框架之下,因而使得VB.NET具备了完全的面向对象特征。这不仅表现在它对面向对象概念的完全支持,尤其是继承性的支持上;而且VB.NET在事件处理机制、控件的布局等方面也具有许多新的特点。本章将主要介绍VB.NET中面向对象概念、事件处理过程、布局调整方法及控件的常用属性与常用事件等控件编程基础知识。
2.1 VB.NET中的面向对象概念
【案例2-1】VB.NET窗体继承演示
(a) (b)
图2-1 窗体的继承
[技能目标]
1. 会制作简单的VB.NET界面
2. 理解窗体的继承
3. 理解VB.NET中面向对象的基本概念
[操作要点与步骤]
1. 启动VS.NET,新建一个项目,名称为"vbnet02";
2. 在窗体上加入两个按钮,"确定"和"退出";
3. 设置"确定"按钮的Modifiers属性为"Public","退出"按钮的Modifiers属性为"Friend"。
4. 在"退出"按钮的Click事件编写输入"End"代码。
5. 在"解决方案资源管理器"中选择Form1.vb对象,在下方的属性窗口的"杂项"中修改"文件名"属性:"vbnet02_01.vb"。
7. 打开"项目"菜单,选择"添加继承的窗体",出现图2-2的对话框。
图2-2 添加继承窗体对话框 图2-3 继承的窗体
8. 选择"打开"按钮,出现"继承选择器"对话框,选择其中的Form1,确定返回。此时主窗口出现一个新的窗体如图2-3所示。该窗体已经具备了窗体Form1的所有控件,但控件左上角都带有 的图标。
一般而言,继承窗体上所有的控件其大小与位置是固定的,不能改变,其对应的事件过程代码也不能改写。但如果在设计被继承窗体时将控件的Modifiers属性变成Public,该控件就可以重新进行属性及代码设置了。
9. 在所生成的继承窗体上再添加如图2-1b所示的标签与文本框,为其进行相应的属性设置。
此时运行程序后即会出现图2-1b所示的界面。
[相关知识]
类是定义了对象特征以及对象外观和行为的模板。就像描述建筑一座大楼的蓝图要一样,类以同样的方式描述组成对象的属性、字段、方法和事件。就像一副蓝图可以用于建成多座建筑一样,一个类也可以用于根据需要创建多个对象。就像蓝图定义使用建筑的人可以访问建筑的哪些部分一样,类也可以通过封装来控制用户对对象项的访问。
对象是类的一个实例,包括了数据及其代码。例如,一个对话框、一个命令按钮、一个文本框均可视为一个对象。通常意义上,类是一类事物的一个抽象的概念,而对象则是具体的指某个事物,类描述了对象的结构。
在可视化语言编程环境中,将用户界面上出现的元素,例如命令按钮、文本框和列表框等,都看成对象。对象是VB.NET程序设计的核心,VB.NET已经设计好了各种对象,程序员可以直接使用这些对象。
在VS.NET开发环境中,工具箱中所显示的各种控件可以认为是类,而通过这些控件在窗体上绘制出的各种界面元素则称为对象。
类及对象具有封装、继承与多态三大基本特征。
封装是指将对象的数据与操作组合成有机的整体。在现役对象程序中,可以通过封装屏蔽对象内部的复杂性,只提供必需的与外界相交互的操作。举例来说,一部电话只要向用户提供拨打电话与接听电话两个基本功能。用户只要知道如何拨打电话和如何接听电话就行了,并不需要了解电话机内部实现这两个功能的具体技术细节。实际上电话机制造商已经将与此相关的复杂技术细节"封装"在电话机内部,用户根本不需要知道这些实现机理。
面向对象程序设计中就是用类来封装对象内部的复杂性,而只将与外界相互操作的功能展现在用户面前。
例如案例2-1中,用户对于这样的界面是非常熟悉的,也知道如何操作。但事实上,无论是按钮还是文本框其对象内部都封装了诸如大小、位置、颜色、字体及对操作的响应代码等等,所有这些用户是无需关心的。
继承也是面向对象中的一个极其重要的概念,继承就是由一个基础类(Base Class)衍生出一个新的类,新类中除了继承基础类中所有的功能外,还可以再加上一些新的方法,或者将基础类中某项需要修改的功能覆盖掉。现实生活中,继承也是普遍在在的。例如图2-3所表示的就是交通工具的继承关系。
图2-3 交通工具的继承关系
案例2-1也正是演示了这种继承关系。在设计第一个窗体vbnet02_01.vb时,打开其代码窗口,代码第2句为:Inherits System.Windows.Forms.Form,意思是该窗体继承了系统的基础窗体类Form.
而在设计第2个窗体时,由于是采用了继承窗体的方法,因此窗体生成代码的第2句变成了:Inherits vbnet02.Form1。说明该窗体已经不再是继承系统的基础类窗体了,而是继承了第1个窗体。
所谓的多态性是指相同的行为在不同的对象中会出现不同的结果。例如有两个Windows窗体,一个是用来显示学生基本信息的窗体A,另一个是用来显示教师基本信息的窗体B,但这两个窗体都有相同的显示窗体的方法Show,无论要显示哪个窗体都是调用Show方法。但使用窗体A的Show方法显示的是学生基本信息;而使用窗体B的Show方法则显示了教师的基本信息。这就是面向对象中的多态性概念。
1. 属性
为了便于操作控制对象,在建立对象时,赋予了它们许多属性。每个对象都有属性。例如,一部电话有颜色和大小;当把一部电话放在办公室中,它又有了一定的位置;而它的听筒也有拿起和挂上两种状态。这些属性体现了该对象的外观和对事件的响应能力等特性,即:属性是对象的性质或是描述对象的数据。改变对象的属性,便可控制其在程序中的作用。
属性的类型因对象的不同而随之变化。比如树木具有种类、形状、颜色以及高度等可见属性;还有一些不可见的属性,如寿命、材质等,所有的树木都可以具有这些属性,但不同的树木个体其属性的值却各不相同。
对象的属性可以进行设置。有些属性可以在设计时通过属性窗口来定义,如影响一个控件在运行时是否可见的Visible属性、对象的名称、标题等;有些属性可在运行时通过编写代码来设置,如文本内容、菜单条目等。
2. 方法
属性是描述对象的数据。方法是让对象实施一个动作或执行一项任务的途径,即方法告诉对象应处理的事情。每一个对象都包含对数据进行操作的代码段,这段代码就是对象能够执行的一个操作,即方法。例如,列表框有Add (增加项目)、Remove(删除项目)和Clear(清除所有项目)等方法来维护其列表中的内容。
3. 事件及事件过程
事件是一种预先定义好的特定动作,由用户或系统激活。
例如,当用户在Windows桌面上用鼠标单击"开始"按钮,单击此按钮的动作就是一个事件。每当这个事件发生时,程序将弹出"开始"菜单,让用户选择,再根据选择引发下一个事件。
对于每个对象都规定了相应的可响应的事件,如鼠标的单击、键盘上的按键、对象内容的更改等。
事件是对象在应用程序运行时所产生的事情,即生成的对象所要完成的任务,如用户单击一个命令按钮就是一个事件。每发生一次事件,将引发一条消息发送至操作系统。操作系统处理该消息并广播给其他窗口。然后,每一个窗口才能根据自身处理该条消息的指令而采取适当的操作(例如,当窗口解除了其他窗口的覆盖时,重显自身窗口)。
在传统的或"过程化"的应用程序中,应用程序自身控制了执行哪一部分代码和按何种顺序执行代码。而在事件驱动的应用程序中,事件可以由用户操作触发、也可以由来自操作系统或其他应用程序的消息触发、甚至由应用程序本身的消息触发。而代码也不是按照预定的路径执行,是在响应不同事件时执行不同的代码片段。这些事件的顺序决定了代码执行的顺序,因此应用程序每次运行时执行代码的路径都是不同的。
代码在执行中也可以触发事件。例如,在程序中改变文本框中的文本将引发文本框的TextChange事件。如果TextChange事件中包含有代码,则将导致该代码的执行。
总之,可以把事件看做是一个响应对象行为的动作。事件发生时可以编写代码进行处理。每个事件都与一段代码相关,与事件相关的代码称为"事件过程"。
[知识扩展]
1. 命名空间
命名空间是Microsoft.NET中非常重要的一个概念。命名空间解决了被称为"命名空间污染"或称为"名称冲突"的问题,由于VB.NET是完全面向对象语言,因此其开发的应用程序所有的代码均封装在各个类之中。当要调用某个类中的某个方法时,必须使用"对象实例名称.方法名"。如果一个系统涉及的对象很多,那么在实际应用中常常会遇到类名重复的问题。为了避免这个问题,VB.NET使用命名空间(NameSpace)来对这些类进行管理。事实上,一个应用程序的所有程序代码都被包含在某些命名空间中。
VB.NET有系统命名空间,所有定义的控件都包含中System.Windows.Forms命名空间中。当然程序员也可以自定义命名空间。默认情况下,用 VB.NET 创建的可执行文件会包含与项目同名的命名空间。例如,如果在名为 VBNET02 的项目内定义一个对象,则可执行文件 (VBNET02.exe) 包含称为VBNET02的命名空间。
2. VB.NET的代码框架与事件处理机制
当在VB.NET中创建窗体时会自动生成一些必要的代码,主要用于声明窗体、对窗体进行初始化。同时随着窗体上对象的增多,相应的代码也会增加。如图2-4是对应图2-1所示窗体的代码窗口。
从图2-4可以看出,VB.NET的代码是以类的形式组织的,第1行即声明了一个名为Form1的类。这说明在VB.NET中整个窗体已经成为了类。
图2-4 VB.NET的代码窗口
第2行说明该窗体类继承了System.Windows.Forms.Form系统基础类。接着是折叠的代码框"Windows窗体设计器生成的代码"。这部分代码正常情况下是折叠的,它不需要用户去管理,由窗体设计器自动生成,它主要是通过代码如何在窗体上创建各种控件的实例,并设置其位置、初始值等等。单击"+"号可以展开,但一般情况下不要对其进行修改,否则会造成意料不到的错误。这部分代码展开后如下所示:
#Region " Windows 窗体设计器生成的代码 "
Public Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
Friend WithEvents Button3 As System.Windows.Forms.Button
Public WithEvents Button1 As System.Windows.Forms.Button
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
Me.Button1 = New System.Windows.Forms.Button
Me.Button3 = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'Button1
'
Me.Button1.Location = New System.Drawing.Point(80,184)
Me.Button1.Name = "Button1"
Me.Button1.TabIndex = 0
Me.Button1.Text = "确定(&O)"
'
'Button3
'
Me.Button3.Location = New System.Drawing.Point(224,184)
Me.Button3.Name = "Button3"
Me.Button3.TabIndex = 2
Me.Button3.Text = "退出(&X)"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6,14)
Me.ClientSize = New System.Drawing.Size(360,237)
Me.Controls.Add(Me.Button3)
Me.Controls.Add(Me.Button1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region
从上面的代码可以看出,不用VB.NET开发环境也可以创建一个VB.NET窗体。创建窗体的全部工作都可以通过代码来实现,但使用开发环境将会使开发工作变得更容易。
在窗体设计器生成的代码之后即为开发人员编写中事件过程与一般的过程。如图2-4中显示了Button3的Click事件代码:
Private Sub Button3_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) _
Handles Button3.Click
End
End Sub
从以上的事件处理代码可以看出,VB.NET中的事件处理过程与VB6.0是非常相似的,但还是在在着不同:
(1)在VB6.0中命令按钮称为Command1,而在VB.NET中则变成了Button1。
(2)事件过程参数有所区别
在VB6.0中,命令按钮的Click事件过程是不带参数的,但VB.NET中却有两个参数:sender与e,sender是System.Object类型的参数,指定了激发该事件的控件;e是System.EventArgs类型的参数,指定了与所激发的事件相关的一些数据。
在VB.NET中所有的事件处理程序都带有这两个参数。
(3)有时候,应用程序所定义的控件很多,而对于这些控件所激发的事件又有着同样或者类似的处理过程。此时如果能通过一个事件处理方法来处理所有要求相同的控件事件,将会大大提高开发效率。在VB6.0中只能通过使用控件数组来实现。而在VB.NET中只要在所指定的事件处理方法声明后面添上Handles关键字,再将希望由该方法处理的控件事件一一列举出来(以逗号隔开)即可,程序员可以通过sender参数判断是哪个控件激发了事件。
2.2 用户界面布局
【案例2-2】窗体界面布局演示
(a) 程序初始运行界面 (b)单击"left"后的运行结果
图2-5 窗体布局演示
VB.NET的用户界面布局功能比VB6.0大大增强了,案例2-2演示了这种效果。通过对控件所提供的Anchor属性与Dock属性进行适当的设置,使得用户在使用时可以非常方便地调整控件的位置与大小。
[技能目标]
1. 控件布局的一般调整
2. 布局工具栏的使用
3. 控件属性Anchor与Dock
[开发步骤]
(1) 在VBnet02项目中增加一个窗体。
(2) 在窗体上添加两个Panel(面板)控件,并进行如下设置:
BoderStyle: Fixed 3D Dock: 左边Panel1设为Fill,右边Panel2设为Right
这样Panel2的宽度将保持不变,而高度可以改变;而Panel1的宽度与高度将随窗体的变化而变化。
(3) 在Panel2中添加一个分组框(GroupBox),并将其Text属性修改为"&Dock".
对控件的Text属性设置时,在某字母前加"&",则可将该字母设置为该控件的访问键(也称为热键)。
再在分组框中添加6个单选按钮,各个Text属性设置如图2-5a所示,Name属性设置成与Text属性相关,如单选按钮"None"的Name属性为rbNone,并将None控件的Checked属性设为True。
(4) 在Panel2中再添加一个分组框,并加入四个复选框,分别命名为cbTop等。
(5) 在Panel1中添加一个Label控件,属性设置如下:
Text: Hello! TextAlign: MiddleCenter
BoderStyle: Fixed 3D Font: 25pt,Bold
Anchor: None BackColor与Forcolor:根据实际情况自行设置。
(6) 编写事件过程代码:
①6个单选按钮的单击事件(Click)过程
Private Sub rb_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) Handles _
rbNone.Click,rbTop.Click,rbLeft.Click,rbBottom.Click,rbRight.Click,rbFill.Click
'根据参数sender的Text属性判断是哪个单选按钮
Select Case sender.Text
Case "&None"
Label1.Dock = DockStyle.None
Case "&Top"
Label1.Dock = DockStyle.Top
Case "&Left"
Label1.Dock = DockStyle.Left
Case "&Bottom"
Label1.Dock = DockStyle.Bottom
Case "&Right"
Label1.Dock = DockStyle.Right
Case "&Fill"
Label1.Dock = DockStyle.Fill
End Select
End Sub
②以下是分别针对4个复选框的CheckedChange事件(状态改变)过程:
Private Sub cbTop_CheckedChanged(ByVal sender As System.Object,ByVal e As _
System.EventArgs) Handles cbTop.CheckedChanged
If cbTop.Checked = True Then
Label1.Anchor = Label1.Anchor Or AnchorStyles.Top
Else
Label1.Anchor = Label1.Anchor Xor AnchorStyles.Top
End If
End Sub
Private Sub cbLeft_CheckedChanged(ByVal sender As System.Object,ByVal e As _
System.EventArgs) Handles cbLeft.CheckedChanged
If cbTop.Checked = True Then
Label1.Anchor = Label1.Anchor Or AnchorStyles.Left
Else
Label1.Anchor = Label1.Anchor Xor AnchorStyles.Left
End If
End Sub
Private Sub cbBottom_CheckedChanged(ByVal sender As System.Object,ByVal e As _
System.EventArgs) Handles cbBottom.CheckedChanged
If cbTop.Checked = True Then
Label1.Anchor = Label1.Anchor Or AnchorStyles.Bottom
Else
Label1.Anchor = Label1.Anchor Xor AnchorStyles.Bottom
End If
End Sub
Private Sub cbRight_CheckedChanged(ByVal sender As System.Object,ByVal e As _
System.EventArgs) Handles cbRight.CheckedChanged
If cbTop.Checked = True Then
Label1.Anchor = Label1.Anchor Or AnchorStyles.Right
Else
Label1.Anchor = Label1.Anchor Xor AnchorStyles.Right
End If
End Sub
[相关知识]
在前面所介绍的案例中所设计的窗体是比较简单的,一般窗体要比此复杂得多,所包含的控件也多。当一个窗体包含了多个控件时,往往要对控件进行各种布局调整。例如在案例2-2的窗体界面设计时,添加控件结束后的界面如图2-6所示。显然控件的位置、大小、对齐等都要进行调整。这里主要介绍成组控件的调整技巧。
图2-6 案例2-2初始布局
为了提高添加控件的效率,对于多个相同类型的控件可以采用复制-粘贴的方法。图2-7就是使用该方法形成的原始界面。
1. 控件的选择
要对一批控件的布局进行调整首先要选择控件。选择多个控件的方法有很多,一般常用框选、鼠标加Ctrl或Shift键等等。在选中多个控件后,其中有一个控件是作为基准控件的,其特征为控件周围的8个控点为黑色,而其余非基准控件则为白色,如图2-6所示即为选择了两个Panel控件后,其中上面的Panel为基准控件。所谓基准控件是指在进行大小、位置调整时将以此控件为基准。
2. 布局工具栏的使用
VB.NET为了提高调整的效率,提供了专门用于调整布局的"格式"菜单与布局工具栏,图2-7显示的即为布局工具栏。
布局工具栏上提供了6组不同的布局工具按钮:
l 对齐到网格:用于将控件与窗体的设计网格对齐
l 对齐调整:共有6个按钮,分别用于调整多个控件按左、中、右等不同的方式对齐。
l 大小调整:共有4个按钮,分别用于调整多个控件在宽度、高度等方向取相同的尺寸。
l 间距调整:有2组共8个按钮,分别用于调整多个控件在水平、垂直两个方向上的间距。
l 居中调整:有水平、垂直两个居中按钮,可调整多个控件相对于窗体进行水平、垂直两个方向上的居中。
l 次序调整:当有多个控件叠放时,用于调整被选中控件是在顶层还是底层。
图2-7 布局工具栏
为了将图2-6中的布局调整为案例2-2的形式,可按下列方式操作:
(1) 先选中上面Panel中的所有单选钮。
(2) 再单击最上面的单选钮,使其成为基准控件
(3) 单击布局工具栏中的左对齐按钮,所有选中的控件均按基准控件对齐。
(4) 再单击布局工具栏中的"使垂直间距相等"按钮,使选中控件的垂直间距均匀分布。
(5) 稍微垂直移动选中控件,使其摆放在Panel1中的适当位置上。
调整完成后的界面如图2-8所示。
利用类似的方法也可以调整Panel2中的所有控件。
默认情况下设计窗体上有设计网格,用于控件的移动、对齐等调整,网格的大小默认为8×8。如果想在调整时不受网格的限制或要改变网格的大小,可通过"工具"→"选项",打开选项菜单,选择"Widnows窗体设计器",对其中的参数进行修改即可。
图2-8 布局调整的初步效果
如果窗体上有许多控件,可以选择那些布局已经确定的控件,右击选择"锁定控件"将这些控件的坐标、大小都锁定,此后再操作其他控件就不会影响到已经锁定的控件了。通过右击,再次选择"锁定控件"即可解除控件的锁定。
在Windows程序设计中,通常窗体的大小是开发人员根据需要来自行调整的,而在程序运行时一般窗体的大小是可以由用户来调整的。这样势必会带来一个问题,那就是窗体上的程各控件布局就会发生变化,从而会破坏原先设计界面的外观。
在以前VB6.0时,为了避免这种情况,程序员只有通过繁琐的编程来控制窗体界面的改变。而在VB.NET中引入了Anchor属性与Dock属性。
1. Anchor属性
Anchor属性是VB.NET新增的一个属性,用于锁定控件的某边与窗体对应边之间的距离,当窗体的尺寸改变时,指定边的距离可以不变。当某个控件的Anchor属性设置成两对边(左右或上下)时,该控件在这个方向的尺寸将随着窗体的大小改变而改变。控件的Anchor属性值如表2-1所示。
表2-1 控件的Anchor属性值
属性值 描述
Bottom 控件锁定到容器的下边界
Left 控件锁定到容器的左边界
None 控件不锁定到容器的任何边界
Right 控件锁定到容器的右边界
Top 控件锁定到容器的上边界
该属性的设置有两种方法:设计时设置与运行时设置。设计时设置就是通过控件的属性窗口进行设置,VB.NET对控件的Anchor属性采用了可视化的设置方法。例如:要将窗体上的某一文本框设置成与窗体的左右边界保持不变,即在调整窗体大小时,文本框的宽度会自动发生变化以保持左右边界的不变。要实现这一点可采用以下方法:
(1) 单击文本框
(2) 在属性窗口中找到Anchor属性(此时的默认值为Top,Left),单击下拉箭头,会出现一个直观的调整界面,如图2-9所示。
(3) 使用鼠标单击控件两边的虚线方块(黑色表示锁定,透明表示不锁定),直到控件左右两边的方块涂黑,上下两边的方块透明。
(4) 单击其它任何位置,即可完成设置。
程序运行后,改变窗体的大小就可以看出Anchor属性的作用效果了。
与一般属性一样,Anchor属性也可以通过代码来设置。设置的语法如下:
控件名.Anchor = AnchorStyles.方向
其中方向代表Top、Bottom、Left、Right。如果需要同时设置几个方向,在两个方向之间用Or连接,例如上例用命令来实现如下:
Text1.Anchor = AnchorStyles.Left Or AnchorStyles.Right
2. Dock属性
控件的Dock属性也是新增的一个属性,它允许控件"附着"在窗体的一个边界上。如果一个控件的Dock属性设置为Right,则该控件就会自动紧靠窗体的右边界,而且上下贯穿整个窗体;如果该属性设置成Fill,则该控件就会充满整个窗体
有些控件在某些方向的尺寸是受到限制的,即使Dock属性设置为Fill,在这个方向上也不会发生变化,如文本框、组合框等。
在属性窗口进行Dock属性的设置也是通过可视的方式,如图2-10。
Dock属性共有6种不同的取值:
l None:没有停靠属性(默认值)。
l Top:控件上边界停靠在容器的上边界上。
l Bottom:控件下边界停靠在容器的下边界上。
l Left:控件左边界停靠在容器的左边界上。
l Right:控件右边界停靠在容器的右边界上。
l Fill:控件各边界停靠在容器的对应边界上。
程序代码的设置方式为:
控件名.Dock = DockStyles.方向
其中方向即为上面6种取值中的一种。
2.3 控件常用属性
VB.NET的控件种类繁多,仅标准工具箱中所提供的控件就达40余种,每种控件又都有许多不同的属性,但是在这些众多的属性中,有相当一部分属性是大多数控件所共有的。因此掌握这些共有属性对掌握控件的使用与设置会起到举一反三的效果。
(1) Text
Text属性决定了控件上显示的文本内容,绝大部分控件都有该属性。利用该属性可以设置或返回控件的文本。
(2) 名称(Name)
所有的控件在刚创建时都有一个默认的名称(如第1个命令按钮的名称为Button1),该属性非常重要,它主要用于对象的惟一标识。从案例2-1和案例2-2中的代码可以看出,各种控件的事件过程命名采用了如下格式:
Private Sub 控件名称_事件名称(参数列表) Handles 控件名称.事件过程名
……
End Sub
控件名称的修改应该在代码编写之前,如果在代码编写之后修改该属性会出现对象找不到或事件过程根本不起作用的情况。
如果控件名称采用默认的命名,不便于编程与记忆,因此通常要对控件名称进行修改。在为控件命名时,一般要遵守约定:控件前缀+自定义名。控件前缀表示了控件的类型,由于每个控件都有一个默认的名称,因此可从该默认名称中取出3个字符作为类型名,用户自定义名时最好有一定的意义,以便于记忆。名称的长度不超过40个字符。如"txtXsxm"表示学生姓名的文本框,"cmdExit"表示退出命令按钮。
(3) Enabled
Enabled属性决定了控件在运行时是否允许用户进行操作,它是逻辑值:"True"允许用户操作并可对其操作作出响应,"False"禁止用户操作,此时只要是可视的控件均呈灰色。几乎所有的控件都有Enabled属性。
(4) Visible
Visible属性决定了控件在运行时是否可见,它也是逻辑值,"True"代表可见,"False"代表不可见,但它不会影响其在设计时的可见性。只有可视控件才有该属性,像Timer那样不可视控件没有该属性。
(5) Font
在VB.NET中Font是一个对象:System.Drawing.Font,它决定了字符的格式,如字体、字号、字形等。在 VB.NET 中,字体在运行时是只读的(即不能直接设置这些属性,但可以分配新的 Font 对象),例如:
label1.Font = New System.Drawing.Font("宋体",20) '将标签的字体设为宋体,大小为20
'将标签的字体改变为粗体与斜体
label1.Font = New System.Drawing.Font(label1.Font,FontStyle.Bold Or FontStyle.Italic)
如果在属性窗口对该属性进行设置,只要通过字体对话框就能实现。
(6) Location与Size
Location与Size决定了控件的位置与大小,Location具有X、Y两个子属性,分别代表X坐标与Y坐标;而Size也有Height和Width两个子属性,指出了控件的高度与宽度。一般在应用程序设计中,控件的位置与大小都是通过在属性窗口直接设置。实际上在上一节中的布局调整也就是调整控件的位置与大小。
如果想在运行时控制控件的位置与大小,例如控制文本框可以使用如下的代码:
TextBox1.Size = New System.Drawing.Size(100,200)
TextBox1.Location = New System.Drawing.Point(100,100)
(7) ForeColor、BackColor
这两个属性分别设置控件的前景色与背景色。其值是一个十六进制常数,通常在属性窗口中使用调色板直接选取。当然也可以使用Color结构来动态设置控件的前景色与背景色。
(8) TextAlign
TextAlign属性设置了控件文本的对齐方式,所以只要是有Text属性的控件都有该属性。绝大部分控件的TextAlign属性一般都9种不同的取值,其设置方法与前述的Dock属性设置一样也是采用了可视化的设置方法(如图2-11所示)
除了以上所介绍的属性外,还有一些属性也是大部分控件所共有的,但由于这些属性使用较少,因此不再赘述。
[知识扩展]
1. .NET的起源
.NET起源于Windows DNA(Distrubuted interNet Architecture,以下简称WinDNA)。和.NET一样,WinDNA也是微软96年在纠正自己的错误指导思想后看到Internet的巨大潜力,而全力推出的。WinDNA不是一个应用程序或系统,而是一个编程模型,利用它企业可以方便地建立流行的n层分布式基于组件的应用。WinDNA技术上主要是以COM为基础构建应用程序,其优点是基于组件开发效率高,但缺点也是有的,就是由于COM的复杂性太高,而且COM是基于C++开发的,通用性、可移植性都受了很大影响。另外还有一些COM的弱点,如维护和性能方面等问题。
当然,需要肯定的是WinDNA还是一个很成熟很实用的框架,在这个框架下也开发出了许多的应用。而且后来的.NET也有许多是借鉴WinDNA的,但由于WinDNA诸多不便之处,特别是网络的迅速普及、Web Services的到来、移动开发的兴起等等,使微软认识到一个能整合各种开发的框架模型对于自己在未来成功甚至于生存是何等的重要。Bill Gates先是提出"软件就是服务(Software As Service)"的思想,并大力宣传这一思想,这样就预测和奠定了Web Services的未来。而后,微软将其大部分人力物力财力,投入到.NET的开发中,可以说.NET就是微软的未来,也是微软对未来的全部赌注。
2. .NET的真面目
.NET是微软重新树立自己在软件业的信心与地位的关键战略与概念,在.NET体系结构中,XML是各应用之间无缝接合的关键。那么,.NET究竟是什么?
2000年6月22日微软正式发布了.NET的基本战略,按照微软的官方描述: ".NET 是 Microsoft 的用以创建 XML Web 服务(下一代软件)平台,该平台将信息、设备和人以一种统一的、个性化的方式联系起来。"
"借助于 .NET 平台,可以创建和使用基于 XML 的应用程序、进程和 Web 站点以及服务,它们之间可以按设计、在任何平台或智能设备上共享和组合信息与功能,以向单位和个人提供定制好的解决方案。"
".NET 是一个全面的产品家族,它建立在行业标准和 Internet 标准之上,提供开发(工具)、管理(服务器)、使用(构造块服务和智能客户端)以及 XML Web 服务体验(丰富的用户体验)。.NET 将成为您今天正在使用的 Microsoft 应用程序、工具和服务器的一部分,同时,新产品不断扩展 XML Web 的服务能力以满足您的所有业务需求。"
.NET的最终目的就是让用户在任何地方、任何时间,以及利用任何设备能访问他们所需要的信息、文件与程序。而用户不需要知道这些东西存放在什么地方,甚至连如何获得等具体细节都不知道。他们只需要发出需求,然后只管接收结果就是了,而所有后台的复杂过程是完全屏蔽起来的。
3. .NET Framework简介
实际上,.NET是一个架构,它包含了在操作系统上进行软件开发的所有层,而且其开发Internet应用程序就像开发桌面程序一样简单。.NET构架的主要组件如图2-12所示。
ASP.NET Windows Forms
Web Services Web Forms Controls Drawing
ASP.NET Application Service Windows Application Service
.NET Framework Base Classes
ADO.NET XML Threading ID
Net Security Diagnostics Etc.
Common Language Runtime
Memory Management Common Type System Lifecycle Management
图2-12 .NET的主要构架
最底层的Common Language Runtime(CLR)被称为"公共语言运行时",它是.NET Framework的核心。包括一个数据类型的公共系统,这些公共类型加上标准接口协议就可以实现跨语言的继承。除了能分配内存与管理内存以外,CLR也可以进行对象跟踪引用和处理无用存储单元收集。
中间层包括下一代标准系统服务,如ADO.NET和XML,这些服务都在Framework的控件下,使它们能够在全世界范围内使用,并保持不同语言用法的一致性。
顶层包括用户和程序接口 ,Windows Forms(通常称为WinForms)是一种制作标准WIN32窗口的更高级的方法。Web Forms提供了一个基于Web的用户接口。最具革命性的应是Web Services,它为程序通过Internet(使用SOAP)进行交流提供了一种机制。Web Services 提供了一种类似于COM和DCOM但基于Internet技术的工具。Web Services和Web Forms主要由.NET的Internet接口工具组成,可以通过.NET Framework中的ASP.NET执行。
以上所有功能都适用于.NET平台上的任何一种语言,当然也包括VB.NET。
练习园地2
一. 基础题
1. 试列举在Windows下屏幕上常见的对象有哪些?
4. 类与对象具有什么特征?
5. 事件与事件过程的关系是什么?
6. VB.NET的事件处理与VB6.0的事件处理有何异同?
7. 控件的Anchor属性与Dock属性各有什么作用?如何使用?
9. VB.NET的代码是如何组织的?
10. 在事件过程编写完成后可以修改控件的Name属性吗?为什么?
11. 试比较在VB6.0中设置字体与VB.NET设置字体有何异同?
12. 简述.NET技术
13. 假设窗体上有两个文本框、两个按钮,要求程序运行后当用户改变窗体的大小时,保证文本框随着窗体的大小而改变,而命令按钮的相对位置不随着窗体的变化而变化。如何设置恰当的控件属性?
二. 实战题
1. 试完成本单元的两个案例。
2. 试设计一个Windows应用程序中常见的打印对话框,并写出所设置的各种属性。
说明:不需要编写程序代码,只需要设计出界面即可
提示:要充分利用布局工具栏
3. 试通过在窗体上放置一个列表框,验证其不同Anchor属性与Dock属性的应用效果。
三、挑战题
1. 请利用Internet搜索有关VB6.0与VB.NET不同的相关文章,并写出一篇相关的小论文。
2. 设计一个具有明显自我个性的窗体(窗体风格、颜色等自行设计),并以此为基类,设计另一个应用窗体(类似于案例2-1)。
原文链接:https://www.f2er.com/vb/264393.html