学院首页>网络编程>ASP.NET>如何在VB.NET中创建Windows应用程序之一

如何在VB.NET中创建Windows应用程序之一

作者:苦丁 来源:赛迪网 添加时间:2006-5-26 10:17:34

对于一个Visual Basic程序员来说,创建的每一个应用程序都是胖客户端的。Web开发从来不是VB的目的,VB专注于开发具有Windows用户界面的单机或C/S结构应用程序,使得VB语言和其窗体引擎得到紧密的结合。在VB6中没有必要区分语言和创建界面的工具,但是在.NET中却是非常有必要的。

在VB.NET中,创建"标准"windows 应用程序的技术是.NET框架的一部分,在任何其它.NET语言中也都可以实现,这是和原先有着巨大改变的。在以下几个部分中,在详细讨论VB.NET中新的窗体技术如何工作。

崭新的Windows 窗体模型

在.NET中的窗体改变了在VB6中的窗体模型,窗体不再是一个专门的文件。编辑窗体或窗体上的控件的属性会产生与你在代码里设置属性一样的真正的VB.NET代码,下面我们通过一个例子来剖析一下VB.NET的新窗体设计器的特点,并看一下通过可视化的编辑所产生的代码。

让我们来看一下窗体Form1的代码,你可以看到这个窗体中的按钮的点击处理程序和一个被称作Windows Form Designer generated code的区域,如下图所示:



在这个区域里,你会看到几个关键的元素:

一个窗体的构造器(constructor)(a Sub New())

一个释放(Dispose)程序

窗体中所有控件的声明

一个名为InitializeComponent的子程序

构造器和释放程序与VB6中的Class_Initialize和Class_Terminate事件基本等效。设计器所产生的代码的实质是其他两部分-控件声明的列表和InitializeComponent程序。看一下创建这个简单的例子所产生的代码。如下:

'NOTE: The following procedure is required by the Windows Form Designer'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor.Friend WithEvents Button1 As System.Windows.Forms.Button<System.Diagnostics.DebuggerStepThrough()> _Private Sub InitializeComponent()  Me.Button1 = New System.Windows.Forms.Button  Me.SuspendLayout()  '  'Button1 '  Me.Button1.Location =   New System.Drawing.Point(96, 88) Me.Button1.Name = "Button1"  Me.Button1.TabIndex = 0  Me.Button1.Text = "Button1"  '  'Form1  '  Me.AutoScaleBaseSize =   New System.Drawing.Size(5, 13)  Me.ClientSize =   New System.Drawing.Size(292, 273)  Me.Controls.Add(Me.Button1)  Me.Name = "Form1"  Me.Text = "Form1"  Me.ResumeLayout(False)End Sub

从上面的代码中的12到15行,你可以看到是用来设置按钮的大小等属性。

假若你增加一些你自己的代码,即使是一些简单的代码,将会产生意想不到的结果。

在这儿,我们只增加一行简单的代码如下:

''Button1'Me.Button1.Location = New System.Drawing.Point(96, 88)Me.Button1.Name = "Button1"Debug.WriteLine("Testing!")Me.Button1.TabIndex = 0Me.Button1.Text = "Button1"

产生的结果如下图

因此除了构造器内的代码,你最好不要直接修改它,而是尽量通过可视化界面来改变其属性。

.NET中的事件处理机制

在vb6中,事件处理程序关联到相应的对象上完全依赖于处理程序的名字。在.NET中怎么关联一个特定的事件处理程序到一个对象的事件呢?

1、使用WithEvents和Hadles关键字

这是Windows窗体设计器默认使用的模型。控件的对象在声明的时候用WithEvents关键字来表示,事件处理程序在程序声明后提供一个Handles 对象名.事件 子句。

通过这两个部分Handels和WithEvents,把对象的事件和事件处理程序关联起来。让我们回到第一个例子上来,看一下设计器是如何把按钮的点击事件和相应的代码处理程序联合起来的。让我们看一下按钮本身定义中的第一行代码:

Friend WithEvents Button1 As System.Windows.Forms.Button

按钮在声明的时候使用了WithEvent关键字。双击Button1,窗体设计器会为默认的点击事件自动产生一个新的事件处理程序。设计器产生的程序在末尾添加了Handles Button1.Click的声明(如下所示)

Private Sub Button1_Click( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs) _    Handles Button1.Click  MsgBox("Hello World!")End Sub

至此,虽然语法可能有点区别,但是总体思路是和VB6中的事件处理机制是基本相同的。不过使用WithEvents和Handles可以实现一些新的特点。例如你可以指定一个特定的事件处理程序处理多个事件。你可以在窗体中创建第二个按钮,然后双击它,产生的第二个事件处理程序如下:

Private Sub Button2_Click( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs) _    Handles Button2.ClickEnd Sub

同样你也可以修改Button1的事件处理程序中的Handles属性如下:

Private Sub Button1_Click( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs) _    Handles Button1.Click, Button2.Click MsgBox("Hello World!")End Sub

现在,无论点击哪个按钮,会执行同样的处理程序。同样通过在多个处理程序的Handles子句中指定同一个事件,一个事件也可以对应多个处理程序:

Private Sub ClickEvent1( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs) _    Handles Button2.Click MsgBox("ClickEvent1")End SubPrivate Sub ClickEvent2( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs) _    Handles Button2.Click  MsgBox("ClickEvent2")End Sub

当Button2被点击的时候,在ClickEvent1和ClickEvent2中的代码都会被执行。

2、通过使用AddHandler/RemoveHandler手动处理事件

这种方法可以允许在运行时动态地将事件与一个或更多的事件处理程序连接或者断开。例如在一个空的窗体上有一个按钮和一个CheckBox.当CheckBox被压下后,通过使用AddHandler,按钮的点击事件被关联到一个简单的事件处理程序,显示一个消息框。当CheckBox在不被选中的时候,使用RemoveHandler来将事件处理程序与按钮分离开来。

Private Sub CheckBox1_CheckedChanged( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs) _    Handles CheckBox1.CheckedChanged  If CheckBox1.Checked Then    AddHandler Button1.Click, _      AddressOf myClickHandler  Else    RemoveHandler Button1.Click, _      AddressOf myClickHandler  End IfEnd SubPrivate Sub myClickHandler( _    ByVal sender As System.Object, _    ByVal e As System.EventArgs)  MsgBox("Event Handled!")End Sub

(T117)

站内搜索