在Windows应用程序中,只向用户显示文字提示的控件有Label、LinkLabel以及StatusBar控件,我们把它们统称为显示文本的控件。上一章我们了解Label和LinkLabel控件(参看:vb.net入门——Label和LinkLabel控件),这里我们就来了解下StatusBar控件。
在Windows应用程序的窗体中,StatusBar控件通常作为窗体中的一个区域显示在窗口的底部,用于显示程序的各种状态信息,我们称它为状态栏。如下图一所示:
StatusBar控件的基本组成单位是状态栏面板——StatusBarPanel,用来显示状态的文本或图标,也可以用来显示指示进程正在执行的动画图标等。
一、向 StatusBar 控件添加面板
StatusBar 控件内的可编程区域由 StatusBarPanel 类的实例组成。添加这些实例的方式是:在设计时通过 StatusBarPanel 集合编辑器,在运行时通过向 StatusBarPanelCollection 类进行添加。
1、在设计时向状态栏添加面板
(1)、从工具箱中向窗体添加StatusBar控件,它在vb.net的工具箱中的图标如下图二所示:
(2)、在窗体上选中StatusBar1,从“属性”窗口中找到 Panels 属性,然后单击省略号按钮 () 打开“StatusBarPanel 集合编辑器”。如下图三所示:
(3)、使用“添加”和“移除”按钮分别向 StatusBar 控件添加面板和从中移除面板。在右侧窗格中出现的属性窗口中配置单个面板的属性。单击“确定”关闭对话框并创建指定的面板。
(4)、在“属性”窗口中,将 ShowPanels 属性设置为 True,这样才能在控件上显示我们创建的面板,否则只显示StatusBar 控件的Text属性。
(5)、下面StatusBarPanel的属性说明:
属性 说明
AutoSize 确定面板的调整大小行为。必须是 StatusBarPanelAutoSize 枚举值之一。
Alignment 设置 StatusBar 控件内面板的对齐方式。必须是 HorizontalAlignment 枚举的值之一。
BorderStyle 面板边缘处显示的边框的类型。必须是 StatusBarPanelBorderStyle 枚举的值之一。
Icon 面板内显示的图标(.ico 文件)。
Style 设置面板的样式。必须是 StatusBarPanelStyle 枚举的值之一。
Text 面板显示的文本字符串。
MinWidth 面板在状态栏中可以具有的最小宽度。
2、以编程方式向状态栏添加面板
(1)、在窗体中添加一个StatusBar控件,一个Button按钮
(2)、在Button按钮的Click事件中添加如下代码:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
StatusBar1.Panels.Add("面板一")
StatusBar1.Panels.Add("面板二")
StatusBar1.Panels.Add("面板三")
StatusBar1.Panels(0).AutoSize = StatusBarPanelAutoSize.Spring
StatusBar1.Panels(1).AutoSize = StatusBarPanelAutoSize.Contents
StatusBar1.Panels(2).AutoSize = StatusBarPanelAutoSize.Contents
'设置面板的样式
StatusBar1.Panels(0).BorderStyle = StatusBarPanelBorderStyle.Raised
StatusBar1.Panels(1).BorderStyle = StatusBarPanelBorderStyle.Sunken
StatusBar1.Panels(2).BorderStyle = StatusBarPanelBorderStyle.Raised
'为面板三添加图标
StatusBar1.Panels(2).Icon = New System.Drawing.Icon(System.Environment.GetFolderPath (System.Environment.SpecialFolder.Personal) & "\Icon.ico")
'让状态栏显示面板
StatusBar1.ShowPanels = True
End Sub
(3)、运行后,单击按钮,效果如下图所示:
二、确定单击了StatusBar 控件中的哪个面板
若要通过对 StatusBar 控件进行编程来响应用户的单击操作,我们可以使用 PanelClick 事件中的 Select Case 语句。该事件包含一个参数(面板参数),该参数包含对单击的 StatusBarPanel 对象的引用。使用该引用可以确定单击的面板的索引,从而可以相应地进行编程。
在前面例子的基础上,我们在StatusBar1控件的PanelClick事件中添加如下代码:
Private Sub StatusBar1_PanelClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.StatusBarPanelClickEventArgs) Handles StatusBar1.PanelClick
Select Case StatusBar1.Panels.IndexOf(e.StatusBarPanel)
Case 0
MessageBox.Show("你单击了面板一")
Case 1
MessageBox.Show("你单击了面板二")
Case 2
MessageBox.Show("你单击了面板三")
End Select
End Sub
现在运行,先按Button1按钮创建状态的三个面板,然后单击某个面板,看看是不是响应了我们的单击事件了呢。如下图五所示:三、创建一个能像VB6的StatusBar控件的StatusBar控件效果
用过vb6中StatusBar控件的朋友一定知道,它的StatusBar控件可以让我们在创建面板的时候选择是否让某个面板显示键盘上的CAPS LOCK、NUM LOCK 或 SCROLL LOCK 之类的键是否按下了,还可以选择在面板上显示时间。现在vb.net中的StatusBar控件就没有这样的功能了,用起来很麻烦,其实我们可以自己做出这样的效果来。
对于在StatusBar控件中显示时间的问题,我们可以通过一个Timer1控件来完成。
对于指示CAPS LOCK、NUM LOCK 或 SCROLL LOCK ,我们可以通过向窗体添加消息筛选器来实现。
首先在窗体中添加一个StatusBar控件、一个timer控件,完整代码如下:
Public Class Form1
Inherits System.Windows.Forms.Form
Implements IMessageFilter
Public Const WM_KEYUP As Integer = &H101
Public Declare Function GetKeyState Lib "user32" Alias "GetKeyState" (ByVal nVirtKey As Integer) As Integer
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Application.AddMessageFilter(Me)
'添加4个panel
Me.StatusBar1.Panels.Clear()
Me.StatusBar1.Panels.Add("Cap State")
Me.StatusBar1.Panels.Add("Num")
Me.StatusBar1.Panels.Add("Scroll")
Me.StatusBar1.Panels.Add("Now")
Me.StatusBar1.ShowPanels = True
Timer1.Interval = 500
Timer1.Enabled = True
'初始化状态
ToggleVirtualKeyStae()
End Sub
Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
Select Case m.Msg
Case WM_KEYUP
ToggleVirtualKeyStae()
End Select
Return False
End Function
Sub ToggleVirtualKeyStae()
If GetKeyState(Keys.CapsLock) = 1 Then
Me.StatusBar1.Panels(0).Text = "Cap"
Else
Me.StatusBar1.Panels(0).Text = ""
End If
If GetKeyState(Keys.NumLock) = 1 Then
Me.StatusBar1.Panels(1).Text = "NUM"
Else
Me.StatusBar1.Panels(1).Text = ""
End If
If GetKeyState(Keys.Scroll) = 1 Then
Me.StatusBar1.Panels(2).Text = "SCROLL"
Else
Me.StatusBar1.Panels(2).Text = ""
End If
End Sub
Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Activated
ToggleVirtualKeyStae()
End Sub
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.StatusBar1.Panels(3).Text = Now.ToString
End Sub
运行,效果如下图所示:按Caps Lock、Num Lock、Scroll Lock等键,指示灯亮的时候状态栏中就有对应的指示了。
因为很多内容涉及到较深的知识我们就不做进一步阐述了,关于消息筛选器的知识你可以参看这里:用ImessageFilter实现截获键盘动作——http://www.qqread.com/aspdotnet/d512187002.html。
关于Timer控件的更多内容请关注下一篇:vb.net入门——Timer 控件
本文作者: