Henry手记:VB.NET Windows 窗体引介(一)

** Henry ** ** 手记 ** ** - VB.NET Windows Forms ** ** 引介(一) **

韩睿 ( 12/21/2002)

― Merry X’mas ! 每一位一直支持我的朋友,希望在每一个冬季的深夜里都能感受到您来信时火一般的热情,鼓励我不断写一点东西,更希望在交流中让你我都能得到提高,得到进步 。

[摘要]在VB.NET中,Windows 窗体有了很大的改变。现在的一个Windows窗体就代表了.NET架构里的System.Windows.Forms.Form类的一个实例。本文通过多个如何编写Windows应用程序这样的基本任务的例程循序渐进地提供了速览新技术的引介。这包括:创建一个窗体,增加控件,事件响应等。本文也提供了对WinForm的面向对象分析,包括最强力的新特点--代码可复用功能:继承。

** 注:原文的例程中用到了 beta版的内容,在译文中已经改为正式版了,请对照原文的作者注意。且在原文的基础上,译者删减了部分OOP基本理论的内容,加入了很多新的内容,以使本文更为充实完整,在这个意义上来说,本文也不是忠实的译文。希望原作者与读者见谅。 **

新版的 VB 添加了一种新特点:继承,以使其可被称为面向对象编程语言。现在,没有人会再抱怨 VB 不是纯 OOP ( object-oriented programming 面向对象编程)语言了。但对于遍及全球的 VB 程序员来说,这意味着什么?是意味着每个 VB 程序员现在必须要学习 OOP 了吗?是的,但答案不会是如此简单。众所周知,易用性是先前版本的 VB 的一大特点。每个人都会记得,拖放控件和创建 Windows 应用是那么的方便,且不需要对 OOP 的理解。在那些版本中,大多数的程序员都不会经常使用它的半吊子 OOP 特性。易用性的特点延续到了现在 Visual Studio .NET 的版本中,创建一个 VB Windows 应用程序仍然和过去一样容易。然而,本文会向您展示为何必须要掌握 OOP 去真正利用 VB.NET 完全强大的功能。

** 创建一个 ** ** VB.NET ** ** 窗体 ** ** **

VB.NET 程序员可以使用 .NET Framework 基本类型库去快速创建一个 Windows 应用程序。 System.Windows.Forms 命名空间提供给您创建一个 Windows 窗体所需要的内容。创建一个窗体,您只需简单地创建一个派生自 System.Windows.Forms.Form 类的一个新类。下面示例创建了一个名为 Form1 的派生自 System.Windows.Forms.Form 的新类

Public Class Form1 : Inherits System.Windows.Forms.Form

End Class

注意:如果您将 Inherits 声明部分写在另一行,您将不需要那个分隔类名与 Inherits 关键字之间的冒号

Public Class Form1

Inherits System.Windows.Forms.Form

End Class

因为当用窗体工作时,您会使用来自 System.Windows.Forms 命名空间的类,您可以引入( import )命名空间以免在您使用每个类时在其前面写上命名空间名。

Imports System.Windows.Forms

Public Class Form1

Inherits Form ‘ 看看这句和上例的区别

End Class

如果您使用 Visual Studio.NET ,它会写上一些初始化代码。如果您不清楚谁是谁的话就会产生混淆。在创建了一个新的 VB.NET 应用程序后,请进入第一个窗体的代码编辑窗口,把里面的内容全部删除掉,然后键入上述的代码。按 F5 运行该应用程序,您将会看到一个空白的窗体(如图 1 所示)。

图 1 :空白窗体

很简单,是不是?这是怎么做到的呢?因为我们的 Form1 类派生自 System.Windows.Forms.Form 类, Form 类包含了实现窗体所需要的元素。而 Form 类是整个派生树的第七级,它派生自 ContainerControl ,而 ContainerControl 又派生自 ScrollableControl ,以此类推。

请看如下所示的图 2:

System.Object

System.MarshalByRefObject

System.ComponentModel.Component

System.Windows.Forms.Control

System.Windows.Forms.ScrollableControl

System.Windows.Forms.ContainerControl

System.Windows.Forms.Form

图 2: System.Windows.Forms.Form 类派生树

您可能还在疑惑不写一句代码怎么可能显示出一个窗体的呢?实际上, Visual Studio.NET 已经帮您做了不少事情。首先,在 vbproj 文件中,它指定了起始运行的类。这就象是有一个隐藏的 Sub Main 。默认情况下,第一个窗体(比如我们的示例中的 Form1 )会是第一个被创建的类。还有,当您不用构造函数来创建一个类时, VB.NET 编译器会设置一个非显式的构造函数:

Public Sub New()

End Sub

因此,我们的 Form1 类实际上也就有了一个构造函数。而显式地创建该构造函数也不是一个坏主意。

Public Class Form1

Inherits System.Windows.Forms.Form

Public Sub New()

‘写入自己的代码

End Sub

End Class

而该构造函数是如何实现对基类 Form 类的继承呢?编译器其实还给您加入了如下一句:

MyBase.New()

MyBase 关键字的行为类似于引用类的当前实例的基类的对象变量(相当于 c++ 中的 this )。 MyBase 常用于访问在派生类中被重写或隐藏的基类成员。具体而言, MyBase.New 用于从派生类构造函数中显式调用基类构造函数。因此,将上述代码写得再完全一点,就是:

Public Class Form1

Inherits System.Windows.Forms.Form

Public Sub New()

MyBase.New()

End Sub

End Class

** ** ** 写入自己的代码 ** ** **

当您用 NEW 关键字实例化一个对象,就会调用一个类的构造函数。在构造函数中,您通常会写一些初始化代码。如果您有大量用于初始化的代码,您可以创建一个私有的过程( sub )以处理初始化工作,从而保证您的代码的易读性。比如说,默认情况下, Visual Sudio.NET 会建立一个名为 InitializeComponent 的过程,并在构造函数中调用它。

将这个运用至先前的代码,我们可以得到:

Public Class Form1

Inherits System.Windows.Forms.Form

Public Sub New()

MyBase.New()

InitializeComponent

End Sub

Private Sub InitializeComponent()

' 在此写入初始化代码

End Sub

End Class

请记住您可以使用关键字 Me 来代表现有类的实例,您可以编写下述的记录窗体的标题与大小的 InitializeComponent 过程:

Private Sub InitializeComponent()

Me.Text = " Henry 的窗体 "

Me.Width = 400

Me.Height = 300

End Sub

当您按下 F5 后,您将可以看到一个宽为 400pixels (像素)、高为 300pixels 的窗体。虽然仍是个空白窗体,但现在它的标题已改变为“ Henry 的窗体”

图 3 Width=400 , Height=300,有标题 的空白窗体

由于初始化失败,对程序带来的破坏是巨大的,因此 Visual Studio.NET 在 InitializeComponent过程 之前好意地提醒您:

'注意:以下过程是 Windows 窗体设计器所必需的

'可以使用 Windows 窗体设计器修改此过程。

'不要使用代码编辑器修改它。

很多人一直疑惑于

 1<system.diagnostics.debuggerstepthrough()>的作用,其实很简单,由于初始化的代码是窗体设计器修改的,因此您的程序有问题,初始化代码不会有问题(如果您按建议办事的话),所以加入了这个特性后,在您逐语句调试时,会跳过  InitializeComponent过程  不进行调试,这就叫做“  DebuggerStepThrogh  ”。您也可以学着在自己的程序中写这样的代码以减少调试的复杂性。 
 2
 3现在的代码就应该是: 
 4
 5<system.diagnostics.debuggerstepthrough()> Private Sub InitializeComponent() 
 6
 7Me.Text = " Henry  的窗体  " 
 8
 9Me.Width = 400 
10
11Me.Height = 300 
12
13End Sub 
14
15写到这,读者会发现自己的程序中的  [Region " Windows  窗体设计器生成的代码  "]  内的内容还有不少没有涉及到,别急,下次再见! 
16
17\---- 
18
19声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。 
20
21QQ: 18349592 
22
23E-Mail: [email protected] 
24
25请访问本人专栏:  http://www.csdn.net/develop/author/netauthor/Latitude/</system.diagnostics.debuggerstepthrough()></system.diagnostics.debuggerstepthrough()>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus