Visual Basic.NET程序设计
上QQ阅读APP看书,第一时间看更新

1.3 窗体与基本控件

早期传统的程序设计是基于求解过程来组织程序流程的。在这类程序中,数据和施加于数据的操作是独立设计的,以对数据进行操作的过程作为程序的主体。面向对象程序设计则以对象作为程序的主体。对象是数据和操作的“封装体”,封装在对象内的程序通过“消息”来驱动运行。在图形用户界面上,消息可通过键盘或鼠标的某种操作来传递。

面向对象程序执行的基本方法是由事件来驱动子程序(在Visual Basic.NET中将子程序称为过程)的运行。在Visual Basic.NET中定义了窗体和其他许多基本控件。窗体对象是Windows应用程序的基本构造模块,是运行应用程序时与用户交互操作的实际窗口。在窗体上设计各类控件对象,通过对象传递消息驱动对象事件程序,完成某一特定的操作。

1.3.1 有关类与对象的概念

面向对象程序设计用类、对象的概念直接对客观世界进行模拟,客观世界中存在的事物、事物所具有的属性、事物间的联系均可以在面向对象程序设计语言中找到相应的机制,面向对象程序设计方法采用这种方式是合理的,它符合人们认识事物的规律,改善了程序的可读性,使人机交互更加贴近自然语言,这与传统程序设计方法相比,是一个很大的进步。

1.对象

对象(Object)是指现实世界中具体存在的实体。每一个对象都有自己的属性(包括自己特有的属性和同类对象的共同属性)。属性反映对象自身状态的变化,表现为当前的属性值。

方法是用来描述对象动态特征的一个操作序列。例如,对学生数据的输入/输出、按出生日期排序、查找某个学生的信息等。消息是用来请求对象执行某一操作或回答某些信息的要求。实际上是一个对象对另一个对象的调用。

Visual Basic.NET程序设计的菜单栏、对话框以及对话框中的各种按钮等,都可以抽象为一个个对象,每个对象有反映其特征的属性,如对话框的大小、位置、颜色等。当需要对象完成某种操作时,可以给对象发送一个消息,例如用鼠标单击这一对象。当它收到消息并进行识别后,即启动相应的程序来完成所需的功能。

2.类

类(Class)是具有相同属性和方法的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。在系统中通常有很多相似的对象,它们具有相同名称和类型的属性、响应相同的消息、使用相同的方法。对每个这样的对象单独进行定义是很费事的,因此将相似的对象分组形成一个类,每个这样的对象被称为类的一个实例,一个类中的所有对象共享一个公共的定义,尽管它们对属性所赋予的值不同。例如,所有的雇员构成雇员类,所有的客户构成客户类等。类的概念是面向对象程序设计的基本概念,通过它可实现程序的模块化设计。

Visual Basic.NET提供各种类,根据类可以创建对象。例如,Visual Basic.NET工具箱中的按钮代表Button类。每次向Visual Basic.NET中的窗体添加按钮时,就是在创建Button类的一个实例。Button类有特定的已定义的属性、方法和事件,如名称属性、Text属性、Move方法、Click事件等。同样,对象也是由属性、方法和事件组成的。

3.封装

封装(Encapsulation)是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。类是数据封装的工具,对象是封装的实现。类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。

4.继承

继承(Inheritance)反映的是类与类之间抽象级别的不同。根据继承与被继承的关系,可分为衍类和基类,基类也称为父类,衍类也称为子类。正如“继承”这个词的字面含义一样,子类将从父类那里获得所有的属性和方法,并且可以对这些获得的属性和方法加以改造,使之具有自己的特点。一个父类可以派生出若干子类,每个子类都可以通过继承和改造获得自己的一套属性和方法,由此,父类表现出的是共性和一般性,子类表现出的是个性和特性,父类的抽象级别高于子类。继承具有传递性,子类又可以派生出下一代孙类,相对于孙类,子类将成为其父类,具有较孙类高的抽象级别。继承反映的类与类之间的这种关系,使得程序设计人员可以在已有的类的基础上定义和实现新类,所以有效地支持了软件构件的复用,使得当需要在系统中增加新特征时所需的新代码最少。

5.多态性

不同的对象收到相同的消息产生不同的动作,这种功能称为多态性(Polymorphism)。将多态的概念应用于面向对象程序设计,增强了程序对客观世界的模拟性,使得对象程序具有了更好的可读性,更易于理解,而且显著提高了软件的可复用性和可扩充性。

1.3.2 Visual Basic.NET对象

在面向对象程序设计中,对象是组成程序的基本部件。在Visual Basic.NET中,所有窗体和控件都是对象。程序设计中使用的这些对象包括描述其特征的属性、反映其动作的行为(称为方法)以及在一定条件下发生的事件,即属性、方法、事件构成一个对象的三要素。

1.对象的属性

属性(Property)是反映对象特征的数据,例如,控件名称、文本、大小等。属性设置有两种方式:

①设计对象时在属性窗口设置属性。

②在程序运行时使用代码设置属性。例如:

2.对象的方法

方法(Method)是用来完成一定操作的一段程序。方法是面向对象的,调用时一定要指明对象。对象方法的调用格式为:

若省略对象,表示当前对象,一般指窗体。例如:

此语句使Textbox1控件获得焦点,光标在本文框内闪烁。

3.对象的事件

事件(Event)是指由系统事先设定的、能为对象识别和响应的动作。事件发生在用户与应用程序交互时,例如单击控件、键盘输入、移动鼠标等都是一些事件。也有部分事件由系统产生,不需要用户激发,如定时器事件、窗体装载事件等。程序代码就是为解决问题所编写的程序。

每一种对象能够“感受”的事件是不同的。例如,窗体能识别单击和双击事件,而按钮能识别单击却不能识别双击事件。每一种对象所能识别的事件,可以从该对象的程序代码窗口中右上方的下拉列表框中看出。在事件框的左边是对象框,当在对象框中选定对象后,再在事件框中选定需要的事件,系统就会自动生成一个约定名称的子程序。该子程序就是处理该事件的程序,称为事件过程,一般格式如下:

其中,对象引用指向引发事件的对象,事件信息是与事件相关的信息。例如,按钮Button1的Click事件过程为:

程序运行时,单击按钮Button1,就会执行事件过程代码,在输出窗口中输出字符“A”的ASCII码值65。一个动作可能同时发生多个事件。例如单击鼠标同时发生了Click、MouseDown、MouseUp事件,编程时,只要对需要的事件过程编码,无编码的事件为空事件,执行该事件过程不实现任何功能。

事件驱动编程机制有如下两个基本要点:

①应用程序由对象组成,每个对象都有预先定义的事件,每个事件的发生都依赖于一定的条件(即用户的驱动或来自系统的触发)。

②每个事件发生后系统该做出什么反应,则取决于用户给该事件过程编写了什么代码,即由用户控制事件的发生,由代码做出响应。

1.3.3 窗体

窗体(Form)对象是Windows应用程序的基本构造模块,是运行应用程序时与用户交互操作的实际窗口。窗体有自己的属性、事件和方法用于控制其外观和行为。

建立一个窗体Form1,系统自动创建3个相关文件:窗体设计界面文件Form1.Designer.vb、窗体代码文件Form1.vb、窗体资源文件Form1.resx。

1.窗体的常用属性

窗体的属性决定了窗体的外观和状态。对于窗体的大部分属性,既可以在属性窗口中设置,也可以在程序代码中设置,有少数属性只能在设计状态或运行状态设置。窗体除了具有通用属性外,还具有以下特有的属性:

①FormBorderStyle属性:用于设置窗体的边框样式。具体取值含义如下:

●None:表示窗体无边框,无法移动及改变大小。

●Fixed Single:表示窗体为单线边框,可移动但不能改变大小。

●Fixed 3D:表示窗体为立体边框,可移动但不能改变大小。

●Fixed Dialog:表示窗体为固定对话框,不能改变大小。

●Sizable:表示窗体为双线边框,可移动并可改变大小。这是该属性的默认值。

●Fixed ToolWindow:表示窗体外观与工具条相似,只有关闭按钮,不能改变大小。

●Sizable ToolWindow:表示窗体外观与工具条相似,只有关闭按钮,能改变大小。

②ControlBox属性:设置窗体标题栏上是否具有控制菜单栏和按钮,其设置值可为True或False。当设置值为True(默认值)时,窗体中将显示控制栏按钮。另外,该属性的作用还与BorderStyle属性有关系。如果将BorderStyle属性设置为None,则该属性将不起作用。注意:ControlBox属性只适用于窗体。

③WindowsState属性:设置程序运行中窗体的最小化、最大化和正常这3种状态。其设置值及其功能如下:

●Normal:表示程序运行时,窗体为正常状态,有窗口边界。

●Minimized:表示程序运行时,窗体最小化为一个示意图标,为最小化状态。

●Maximized:表示程序运行时,窗口充满整个屏幕,无边界,为最大化状态。

④Icon属性:用来设置窗体最小化时的图标,图标文件是.ico格式的文件。该属性只适用于窗体。

⑤BackGroundImage属性:设置窗体中要显示的图形。

⑥MaximizeBox属性:用来设置窗体是否具有最大化按钮,其设置值可为True或False。当设置为False时,则窗体无最大化按钮。该属性只适用于窗体。

⑦MinimumBox属性:用来设置窗体是否具有最小化按钮,其设置值可为True或False。当设置为False时,则窗体无最小化按钮。该属性只适用于窗体。

2.添加窗体

新建一个项目,自动创建第一个窗体。在建好第一个窗体后可以根据需要继续向这个项目中添加其他窗体。向一个项目中添加窗体,既可添加一个新窗体,也可以添加一个已经建好存在的窗体。添加窗体有2种常用的方法:

①选择“项目”菜单中的“添加Windows窗体”命令。

②选择“项目”菜单中的“添加新项”命令。

③右击解决方案资源管理器窗口中的项目名称,在弹出的快捷菜单中选择“添加”→“新建项”命令。

这3种操作都会打开“添加新项”对话框,如图1-1-7所示。

图1-1-7 “添加新项”对话框

如果需要添加现存窗体,可选择“项目”菜单中的“添加现有项”命令,打开“添加现有项”对话框,选择窗体文件,如图1-1-8所示。

图1-1-8 “添加现有项”对话框

3.删除窗体

在解决方案资源管理器窗口中,右击要删除窗体的名称,在弹出的快捷菜单中选择“从项目中排除”命令,即可删除此窗体。

4.设置启动窗体

当程序运行时,首先运行的窗体叫启动窗体。默认情况下,在设计阶段建立的第一个窗体被指定为启动窗体,也可以选择一个窗体作为程序运行的启动窗体,操作步骤如下:

①从“项目”菜单中选择“(项目名)属性”命令或者在解决方案资源管理器中右击项目名,在弹出的快捷菜单中选择“属性”命令,打开“属性”对话框。

②在“属性”对话框中,选择“应用程序”选项卡。在“启动窗体”下拉列表框中,选择作为启动窗体的窗体,单击“确定”按钮。

5.窗体操作的方法

在多重窗体应用程序中,由于多个窗体的存在,必然涉及各个窗体的添加、窗体的卸载、窗体的显示、窗体的隐藏等操作,Visual Basic.NET对应这些操作提供了Show方法、Hide方法、ShowDialog方法。例如,在窗体Form1中用代码打开窗体Form2,采用以下语句:

Show方法将Form2作为普通的窗体显示出来,而ShowDialog方法则将其作为模式对话框进行显示。这两种方法的区别在于,对Show方法的调用立即返回,Form1继续执行Show方法调用后面的代码,而对ShowDialog的调用将被阻塞,直到Form2被关闭为止。此外,ShowDialog方法显示对话框后还能接收到一个返回值,表示用户在对话框中进行操作的结果。只需在Form2中的恰当位置将其自身的DialogResult属性设置为DialogResoult枚举的某个值之一,就可以关闭Form2并向Form1返回这个DialogResult值。

6.窗体的常用事件

窗体的事件较多,常用的有:

①Click事件:当单击窗体的空白区域时,触发该事件。

②DoubleClick事件:当双击窗体的空白区域时,触发该事件。应当注意,双击事件包含单击事件,双击一次要先触发一次单击事件,然后再触发一次双击事件,因此,在编程时,对同一个对象,一般不要同时使用单击和双击事件过程。

③Load事件:当用Load语句将窗体加载到内存时,触发该事件。

④Activated事件:当窗体变成活动窗体时,触发该事件。

1.3.4 基本对象

1.按钮对象

按钮(Button)主要用来执行某一功能,通常在按钮的Click事件中编写一段程序,当用户单击这个按钮时,就会启动这段程序,完成某一特定的操作。

(1)按钮的常用属性

①Enabled属性:设置按钮是否能被按下。设定值为True(默认值)时表示该按钮能被按下以执行特定功能,为False表示该按钮不能按下来执行特定功能。

②FlatStyle属性:设置按钮的外观。有以下4种取值:

●Flat:按钮以平面显示。

●Popup:鼠标在按钮上时以Flat形式显示,否则以Standard显示。

●Standard:该控件的外观为三维。

●System:由操作系统决定外观形式。

③DialogResult属性:当将窗体作为对话框调用时,设置返回结果。如果用户按下此按钮,将返回此属性中的值。

(2)按钮的常用方法

可以使用Focus方法将焦点移至指定的按钮,使指定的按钮被选中,即获得焦点。

注意:Focus方法用于可视窗体或控件对象,但不能用该方法把焦点移到Enabled属性被设置为False的窗体或控件上。如果已在设计时将Enabled属性设置为False,必须在使用Focus方法之前,先将对象的Enabled属性设置为True,才能使其接收焦点。

(3)按钮的常用事件

按钮可以接受许多事件,例如,鼠标单击(Click)事件、鼠标按下(MouseDown)事件、鼠标松开(MouseUp)事件、键盘按下(KeyDown)事件和键盘松开(KeyUp)事件等,其中最常用的是Click事件,当用户在按钮上单击时触发。

【例1-1】输入半径,计算圆的面积和周长,程序运行界面如图1-1-9所示。

图1-1-9 计算圆的周长和面积程序的运行界面

在窗体上放置3个Lable控件和3个TextBox控件,分别用于输入圆的半径、显示面积和周长,再放置3个Button控件,分别用于求面积、求周长和退出窗体。各控件的主要属性如表1-1-2所示。

表1-1-2 控件的属性设置

在程序的代码窗口编写下列代码:

2.标签对象

标签(Label)是Visual Basic.NET中最简单的控件,用于显示字符串,通常显示的是文字说明信息,但不能编辑标签控件。

使用标签的情况很多,通常用标签来标注本身不具有Text属性的控件。例如,可用标签为文本框、列表框、组合框等控件来添加描述性的文字。还可编写代码改变标签控件的显示文本以响应运行时的事件。例如,若应用程序需要用几分钟处理某个操作,则可用标签显示处理情况的信息。

(1)标签的常用属性

标签的属性很多,除了具有和窗体相同的名称、Text属性外,还有以下几个常用的属性。

①AutoSize属性:设置控件是否能够自动调整大小以显示所有的内容。其中,True(默认值)表示能够自动调整大小,False表示不能自动调整大小。

②BorderStyle属性:设置标签的边框样式。其值可以为None(默认值)、Fixed Single或Fixed3D,分别表示无边框、单线边框和立体边框。

③Image属性:设置标签的背景图片。在程序中采用以下语句改变标签的背景图片:

(2)标签的常用方法

常用的标签方法有Show、Hide等,用于标签控件的显示和隐藏。

(3)标签的常用事件

一般很少使用标签事件,Click事件在单击标签时触发。

【例1-2】设计一个窗体说明标签的基本应用方法。

首先创建一个项目,系统在其中自动添加一个窗体,在该窗体中放置4个标签。各个标签的属性如表1-1-3所示。

表1-1-3 标签的属性设置

窗体的执行界面如图1-1-10所示。

图1-1-10 窗体的执行界面

4.文本框对象

文本框(TextBox)常用来输入和输出信息,是Visual Basic.NET中显示和输入文本的主要对象,也是Windows用户界面中最常用的控件。文本框提供了基本文字处理功能,在Windows环境中几乎所有的输入动作都是利用文本框来完成的。文本框是个相当灵活的输入工具,可以输入单行文本,也可以输入多行文本,还具有根据控件的大小自动换行以及添加基本格式的功能。

(1)文本框的常用属性

文本框除了具有和窗体相同的名称、Text属性外,还有以下几个常用的属性。

①MaxLength属性:设置文本框中输入的字符串长度是否有限制。默认值为0,表示该单行文本框中字符串的长度只受操作系统内存的限制。若设置为大于0的数,则表示能够输入的最大字符数目。

②MultiLine属性:设置文本框是否以多行方式显示文本。设置为True时以多行文本方式显示;设置为False(默认)时以单行方式显示,超出文本框宽度的部分被截除。

③PasswordChar属性:设置是否在控件中显示用户输入的字符。如果该属性设置为某一字符,那么无论Text属性值是什么,在文本框中都只显示该字符。另外,要想使该属性有效,MultiLine属性必须设置为False。

为了在对话框中创建一个密码输入文本框,应该使用PasswordChar属性。

④ScrollBars属性:设置文本框是否有垂直或水平滚动条。其中的值有如下4种:

●None(默认值):表示没有滚动条。

●Horizontal:表示仅有水平滚动条。

●Vertical:表示仅有垂直滚动条。

●Both:表示有水平和垂直两种滚动条。

注意:文本框控件的ScrollBars属性设置为1、2或3时,必须将MultiLine属性设置为True,滚动条才会出现。

⑤ReadOnly属性:决定运行时用户可否在此文本框中输入文本。为True时为只读,为False(默认)时可读可写。

⑥AcceptsReturn和AcceptsTab属性:如果设置为True,则多行文本框会将CRLF和制表符当作有效字符。要禁止在文本框中输入CRLF,请将此属性设置为False。

⑦WordWrap属性:决定文本框的文字是否自动换行。为True(默认)时自动换行,为False时不自动换行。

⑧CharacterCasing控制用户在此控件中输入的字母的大小写。选项包括Normal、UpperCase和LowerCase。

⑨TextAlign当用户在文本区域输入数据时,此属性控制文本的对齐方式。可将此属性设置为Left、Right或Center。只有将MultiLine属性设置为True,才可以在文本框内用Alignment属性设置文本的对齐方式。如果MultiLine属性是False,则Alignment属性不起作用。

⑩SelectionLength、SelectionStart和SelectedText属性:SelectionLength返回/设置选定的字符数;SelectionStart返回/设置选定文本的起始点;SelectedText返回/设置包含当前选定文本的字符串。

(2)文本框的常用方法

文本框的方法较少使用,较常用的方法是SetFocus。SetFocus方法用于将焦点移至文本框(也就是使插入点进入文本框以便接收输入信息)。

(3)文本框的常用事件

文本框较常用的事件是GotFocus、LostFocus、TextChanged和KeyPress。

①GotFocus事件:在文本框获得焦点时触发该事件。获得焦点可以通过诸如按【Tab】键切换,或单击对象之类的用户动作,或在代码中用SetFocus方法改变焦点来实现。

②LostFocus事件:在文本框失去焦点时触发该事件。也就是说当按下【Tab】键离开当前文本框或用鼠标选择其他对象时触发该事件。

③TextChanged事件:在改变文本框的内容时触发该事件。

④KeyPress事件:在文本框中按任一键时触发该事件。

【例1-3】设计一个窗体,说明文本框的基本应用方法。

新建一个项目,在项目中自动添加一个窗体,在其中创建两个标签和两个文本框。标签用于显示提示信息,其标题分别为“密码”和“明码”。两个文本框中,上一个TextBox1是主文本框,用于输入密码,密码输入时以“*”形式显示出来,该文本框的PasswordChar属性设置为“*”。屏幕下方的文本框的名称为TextBox2,用于以明码方式显示在第一个文本框中输入的内容。为此,在文本框TextBox1上设计如下事件过程:

当在第一个文本框中输入密码时,将在第二个文本框中显示该明码,其执行界面如图1-1-11所示。

图1-1-11 文本框执行界面