正文

如何在VB.NET中创建Windows应用程序之一  2005-09-27 13:20:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/iamben250/5406.html

分享到:

如何在VB.NET中创建Windows应用程序之一
作者:苦丁 发文时间:2005.07.26
对于一个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 = 0
Me.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.Click
End 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 Sub
Private 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 If
End Sub
Private Sub myClickHandler( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs)
  MsgBox("Event Handled!")
End Sub


阅读(1667) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册