VB.NET中几种高级窗体技术的应用
1 引言:
VB.NET中的窗体(Form类)相对于VB6而言,功能已变得十分强大,很多在VB6中需要通过API 函数或复杂的编程才能完成的功能,.NET中只需要设置窗体属性或几行简单代码即可实现。本文将从实际编程的角度出发,介绍几种VB.NET中的高级窗体技术,包括子类派生、异形窗体及透明效果、本地化窗体、动态控件属性等技术的应用。
2 窗体子类派生技术
像限制窗体大小、判断窗体的移动等功能,在VB6编程中需要利用子类派生技术来实现,而在.NET 中,很多窗体新增的属性、事件即可完成这些任务。但有时仍然需要使用子类派生,例如:程序中要用到一个不带标题栏的窗体,通过鼠标在窗体上任何位置的拖动来改变窗体位置。
窗体对象的子类派生技术依赖于继承机制。System.Windows.Forms.Form类公开了WndProc方法,该方法被Windows发送到窗体的每条消息调用。由于WndProc方法被定义为Protected和Overridable,所以在窗体的派生类中可以重写它。通过重写此方法,就可以重新定义窗体的行为。
WinProc方法接收一个Message对象参数,此对象包括5个属性:Msg(消息的ID)、HWnd(窗口的句柄)
、Wparam和Lparam(传递给窗口的参数,取决于具体的消息)、Result(返回给操作系统的值)。在重写WinProc方法时,首先应调用其基类的默认处理方法,进行一般消息的处理工作,然后检查该消息的Msg属性,并决定如何响应某些特殊消息。
多数情况下,我们只需根据消息给出相应的提示,但在某些时候,需要将特定的值赋给消息的Result 属性并返还给Windows,达到“欺骗”Windows的目的。例如,下面的代码捕获了WM_ACTIV A TEAPP 消息,判断窗体是否被激活并显示提示;捕获WM_NCHITTEST消息,将HTCLIENT值(代表鼠标位于窗体的工作区)改为HTCAPTION值(代表鼠标位于窗体的标题栏中)赋给Result属性,以实现拖动,如图1。
(图1:窗体子类派生)
Public Class Form1
Inherits System.Windows.Forms.Form
#Region " Windows 窗体设计器生成的代码 "
Private Const WM_NCHITTEST As Integer = &H84
Private Const WM_ACTIVATEAPP As Integer = &H1C
Private Const HTCAPTION As Integer = 2
Private Const HTCLIENT As Integer = 1
'定义消息
Protected Overrides Sub WndProc(ByRef m As Message)
MyBase.WndProc(m)
'调用基类的WinProc方法处理消息
Select Case m.Msg
Case WM_ACTIVATEAPP
If m.WParam.ToInt32 <> 0 Then
Label1.Text = "窗体被激活!"
Else
Label1.Text = "窗体被停用!"
End If
'窗体被激活时,WParam属性返回一个非零值
Case WM_NCHITTEST
'鼠标位于窗体上方时发送WM_NCHITTEST消息
If m.Result.ToInt32 = HTCLIENT Then
m.Result = New IntPtr(HTCAPTION)
'修改消息值
End If
End Select
End Sub
End Class
此外,我们还可捕获系统颜改变、字体改变、窗体大小调整、Windows会话关闭等消息并进行处理。要详细了解Msg、LParam和Wparam等属性,读者可阅读MSDN Library中的Platform SDK 文档。
3 异形窗体及透明效果
窗体具有一对十分有趣的属性:Transparencykey和Opacity。
如果将某种颜值赋给Transparencykey属性,则窗体上此种颜覆盖的区域将被处理成透明的,并且不能被绘制。用户在这些地方单击,会激活后面的窗体。因此我们只要使用不同于Transparencykey属
性的颜值在窗体上绘制图形,就可创建出形状奇异的窗体,如三角形、圆形甚至五角星形的窗体。
可以利用GDI+在窗体上绘制图形,也可通过任何的图形软件(如画图)来创建一个位图,再将该位图加载到窗体的BackgroundImage属性。如果把窗体的FormBorderStyle属性设置为None,去掉标题栏和边框,会获得更好的效果。
Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles MyBase.Paint
Me.TransparencyKey = Color.Blue
' 定义蓝为透明
Dim b As New SolidBrush(Me.BackColor)
' 创建与窗体背景同的画笔对象
e.Graphics.FillRectangle(Brushes.Blue, Me.ClientRectangle)
' 用蓝画一个覆盖窗体的矩形
e.Graphics.FillEllipse(b, Me.ClientRectangle)
' 用背景画一个实心椭圆
e.Graphics.FillRectangle(Brushes.Blue, 100, 100, 230, 100)
' 用蓝在椭圆内画一个较小的矩形
e.Graphics.DrawEllipse(Pens.Black, Me.ClientRectangle)
' 为椭圆加一条黑的边框
b.Dispose()
' 取消画笔对象
End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click Dim op As Double
For op = Me.Opacity To 0 Step -0.005
Me.Opacity = op
Next
'实现窗体淡出效果
MessageBox.Show("再见!")
End
End Sub
显然,不管如何定义窗体,都应向用户提供关闭和移动窗体的功能。所以应准备一个按钮用于关闭窗体,并结合前面介绍的窗体子类派生技术实现移动。
Opacity属性是一个0到1范围内的Double型数值,代表了整个窗体的透明性:为1时,窗体表现为正常状态;为0时,窗体完全透明。可以将该属性用于淡入淡出等特殊效果。本例中,我们建立了一个椭圆形且中空的窗体,单击按钮后,窗体会逐渐透明变淡,最终消失,如图2。
(图2:异形窗体)
4 本地化窗体
当我们需要开发一个支持多语言界面的软件时,传统的方法是使用资源文件,再编写提取各个字符串(或图像)并应用到界面中的代码,显然这种方式很难实现快速应用程序开发。在VB.NET中,窗体设计器用一种简洁高效的方法解决了这个问题。
图3所示的窗体是程序的中文界面(默认语言),包括一些中文字符串和一幅图片。在完成后,我们就可以对应设置其英文(或其他语言)的界面。
(图3:本地化窗体中文)
在属性窗口将窗体的Localizable属性设为True,表示要为窗体生成本地化代码。接下来将窗体的Language属性设置为希望支持的语言类型(如英语),如图4所示。
(图4:Language属性设置)
现在可以修改窗体中各个控件的属性(包括文本、位置、大小、图片等),这些设置都只与刚才选择的语言相关联。当然,你可以重复这一步骤直到设置完所有希望支持的语言。图5为程序的英文界面。
(图5:本地化窗体英文)
本地化窗体的最大好处在于大多数情况下可以不去考虑它们,用户像运行一个普通程序一样对待本地化窗体程序。如果用户的系统语言与已定义的某种语言匹配,则程序窗体和控件将自动使用为该语言所作的设置,否则,使用默认设置。
本地化窗体的测试是一个问题:在一台电脑上安装多套系统是很麻烦的。较简单的方法是更改UI线程的区域设置,将适当的CultureInfo对象赋给Thread.CurrentThread对象的CurrentUICulture属性来实现。我们需要在窗体的New()过程中设置它(打开"Windows窗体设计器生成的代码",在New过程中添加如下语句):
Public Sub New()
MyBase.New()
System.Threading.Thread.CurrentThread.CurrentUICulture = New
System.Globalization.CultureInfo("en-US")
‘设置语言区域为英语(美国)
InitializeComponent()
End Sub
vb软件开发运行时,用不同的区域代码初始化窗体,窗体将自动以匹配的效果显示。区域代码(如"en-US")可在MSDN中查得。
5 动态控件属性
请看图6所示的窗体:一个用于同数据库进行连接的登录对话框。为了便于用户的操作,在编程时已预定义了服务器名和用户名。很显然,如果采用给控件属性直接赋值的方法,开发者需要为每个用户重新
编译程序,这几乎是不可能的。在.NET之前,一般用.ini文件实现此目的,而.NET中通过配置文件的动态属性,提供了一种更标准的解决方案。
(图6:动态控件属性窗体)
设计窗体时,选择需要设置动态属性的控件(如TextBox1),在“属性”窗口中展开DynamicProperties 项,单击Advanced项旁的省略号按钮,会出现如图7所示的对话框。
(图7:设置动态属性的对话框)
到并选择希望设为动态的属性(如本例中的Text属性),确定后,.NET会自动为程序创建一个配置文件“fig”(文本文件),在文件的<appSettings>部分,包含了设置好的控件属性名及对应的属性值。程序运行时,这个值将被读出并作用在控件的动态属性上。编译程序后,bin\目录下会出现“程序名.fig”配置文件,用记事本打开并修改相应的属性值,即可实现动态控件属性效果,如图8。当然,最好是在程序中由用户来决定控件的动态属性值,编程者利用文件操作修改配置文件中的属性值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论