前端之家收集整理的这篇文章主要介绍了
VBNET编程之托盘程序篇,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
托盘程序是指这样一类程序:当程序运行后,会在系统的托盘区(也有说是状态区域)创建此程序的图标,使用者可以通过点击图标出现的菜单来控制程序的运行状态。托盘程序有很多优点,如不占屏幕,后台运行,便于控制等。所以现在越来越多的程序都做成了托盘程序。在VB.NET中,编写托盘程序是比较方便和简单的。这是因为VB.NET没有自身类库,它所使用的类库是.Net框架中为所有.Net平台开发语言提供的公用类库——.Net FrameWork SDK。在这个类库中,为编写托盘程序提供了具体的类,调用这些类就可以实现程序的托盘效果了。从而也就摆脱了它的前身VB在处理这类问题时候的烦琐。下面就通过二个具体例子来了解并掌握如何用VB.NET编写托盘程序。
本文程序的设计及运行环境
(1)Windows 2000 Service
(2)Net Framework SDK 正式版
静态托盘程序的编写过程
所谓静态托盘程序是指程序运行后,在系统托盘区的图标处于静止状态的托盘程序。动态托盘程序正好与之相反,它是指在系统托盘区图标呈现动画效果的一类托盘程序。下面就来探讨一下VB.NET是如何实现静态托盘程序。
.Net FrameWork SDK为编写托盘程序提供了一个组件:NotifyIcon组件。NotifyIcon组件是一个WinForm组件,位于命名空间"System.Windows.Forms"中,在VB.NET程序中,只要创建一个NotifyIcon组件的实例,并且对NotifyIcon实例的"Icon"属性赋值,这样一个简单的托盘程序就完成了。下面就是这个简单托盘程序对于的代码(Form1.vb):
- Public Class Form1
- Inherits System.Windows.Forms.Form
- #Region " Windows 窗体设计器生成的代码 "
- Public Sub New ( )
- MyBase.New ( )
- '该调用是 Windows 窗体设计器所必需的。
- InitializeComponent ( )
- '在 InitializeComponent ( ) 调用之后添加任何初始化
- End Sub
- '窗体重写处置以清理组件列表。
- Protected Overloads Overrides Sub Dispose ( ByVal disposing As Boolean )
- If disposing Then
- If Not ( components Is Nothing ) Then
- components.Dispose ( )
- End If
- End If
- MyBase.Dispose ( disposing )
- End Sub
- 'Windows 窗体设计器所必需的
- Private components As System.ComponentModel.IContainer
- '注意:以下过程是 Windows 窗体设计器所必需的
- '可以使用 Windows 窗体设计器修改此过程。
- '不要使用代码编辑器修改它。
- Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon
- '创建一个NotifyIcon实例
- Friend TrayIcon = New Icon ( "Tray.ico" )
- '创建一个Icon实例
- <System.Diagnostics.DebuggerStepThrough ( ) >
- Private Sub InitializeComponent ( )
- Me.components = New System.ComponentModel.Container ( )
- Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon ( Me.components )
- Me.NotifyIcon1.Text = "NotifyIcon1"
- Me.NotifyIcon1.Visible = True
- '对NotifyIcon实例的Icon属性赋值,完成简单托盘程序
- Me.NotifyIcon1.Icon = TrayIcon
- Me.AutoScaleBaseSize = New System.Drawing.Size ( 6,14 )
- Me.ClientSize = New System.Drawing.Size ( 292,273 )
- Me.Name = "Form1"
- Me.Text = "Form1"
- End Sub
- #End Region
- End Class
- '启动程序
- Module Module1
- Sub Main ( )
- Application.Run ( new Form1 ( ) )
- End sub
- End Module
|
但是这个托盘程序还不是真正意义上的托盘程序,因为它还有很多具体
功能没有实现,下面就列出这些
功能,并介绍具体的
实现方法
(1).托盘程序是隐藏窗口后,程序不应该
显示在任务栏中,并且一般运行后都
不显示窗口:
这是通过设定窗体的
属性来完成的,具体如下:
- '设定程序不应该显示在任务栏
- Me.ShowInTaskbar = False
- '设定程序运行后最小化
- Me.WindowState = System.Windows.Forms.FormWindowState.Minimized
|
(2).定义托盘程序中的
菜单和相关事件:
往NotifyIcon实例中
添加菜单,首先要创建ContextMenu实例,此实例主要作用是表示快捷
菜单,其中的
菜单项是通过创建MenuItem实例来实现,托盘程序中的
菜单有几个
菜单项,就创建几个MenuItem实例。然后把这些
菜单项加入到ContextMenu实例,并把此实例赋值给NotifyIcon实例的ContextMenu
属性,这样托盘程序右键点击弹出的
菜单就完成了。下面是具体
代码:
- 创建ContextMenu实例和MenuItem实例:
- Friend WithEvents ContextMenu1 As System.Windows.Forms.ContextMenu
- Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
- Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem
- Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem
|
把这些
菜单项加入到ContextMenu实例,并把ContextMenu实例赋值给NotifyIcon实例的ContextMenu
属性:
- Me.MenuItem1 = New System.Windows.Forms.MenuItem ( )
- Me.MenuItem2 = New System.Windows.Forms.MenuItem ( )
- Me.MenuItem3 = New System.Windows.Forms.MenuItem ( )
- Me.NotifyIcon1.ContextMenu = Me.ContextMenu1
- Me.NotifyIcon1.Text = "VB.NET的托盘程序"
- Me.NotifyIcon1.Visible = True
- '设定托盘程序托盘区位置显示图标
- Me.NotifyIcon1.Icon = TrayIcon
- '在ContextMenu实例中加入菜单项
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem1 )
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem2 )
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem3 )
- Me.MenuItem1.Index = 0
- Me.MenuItem1.Text = "显示窗体"
- Me.MenuItem2.Index = 1
- Me.MenuItem2.Text = "隐藏窗体"
- Me.MenuItem3.Index = 2
- Me.MenuItem3.Text = "退出"
|
当把ContextMenu实例赋值给NotifyIcon实例的ContextMenu
属性后,托盘程序的缺省状态是当鼠标右击托盘图标,就会弹出对应的
菜单。这时就可以对其中的每一个
菜单项定义相应的事件以及具体的处理
方法。一个完整的静态托盘程序的编写过程就完成了。
最后要请读者注意的是,由于本文中的托盘程序的图标并不是通过创建资源文件来实现的,而是通过创建Icon实例完成的。所以在程序运行的时候,必须在程序的当前目录存在一个图标文件,并且此图标文件的名称为"Tray.ico"。下面是这个静态托盘程序的完整的代码清单(Form2.vb):
- Public Class Form1
- Inherits System.Windows.Forms.Form
- #Region " Windows 窗体设计器生成的代码 "
- Public Sub New ( )
- MyBase.New ( )
- '该调用是 Windows 窗体设计器所必需的。
- InitializeComponent ( )
- '在 InitializeComponent ( ) 调用之后添加任何初始化
- End Sub
- '窗体重写处置以清理组件列表。
- Protected Overloads Overrides Sub Dispose ( ByVal disposing As Boolean )
- If disposing Then
- If Not ( components Is Nothing ) Then
- components.Dispose ( )
- End If
- End If
- MyBase.Dispose ( disposing )
- End Sub
- 'Windows 窗体设计器所必需的
- Private components As System.ComponentModel.IContainer
- '注意:以下过程是 Windows 窗体设计器所必需的
- '可以使用 Windows 窗体设计器修改此过程。
- '不要使用代码编辑器修改它。
- Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon
- Friend WithEvents ContextMenu1 As System.Windows.Forms.ContextMenu
- Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
- Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem
- Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem
- Friend TrayIcon = New Icon ( "Tray.ico" )
- <System.Diagnostics.DebuggerStepThrough ( ) >
- Private Sub InitializeComponent ( )
- Me.components = New System.ComponentModel.Container ( )
- Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon ( Me.components )
- Me.ContextMenu1 = New System.Windows.Forms.ContextMenu ( )
- Me.MenuItem1 = New System.Windows.Forms.MenuItem ( )
- Me.MenuItem2 = New System.Windows.Forms.MenuItem ( )
- Me.MenuItem3 = New System.Windows.Forms.MenuItem ( )
- Me.NotifyIcon1.ContextMenu = Me.ContextMenu1
- Me.NotifyIcon1.Text = "VB.NET的托盘程序"
- Me.NotifyIcon1.Visible = True
- '设定托盘程序托盘区位置显示图标
- Me.NotifyIcon1.Icon = TrayIcon
- '在ContextMenu实例中加入菜单项
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem1 )
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem2 )
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem3 )
- Me.MenuItem1.Index = 0
- Me.MenuItem1.Text = "显示窗体"
- Me.MenuItem2.Index = 1
- Me.MenuItem2.Text = "隐藏窗体"
- Me.MenuItem3.Index = 2
- Me.MenuItem3.Text = "退出"
- Me.AutoScaleBaseSize = New System.Drawing.Size ( 6,14 )
- Me.ClientSize = New System.Drawing.Size ( 292,273 )
- Me.Name = "Form1"
- '设定程序不应该显示在任务栏
- Me.ShowInTaskbar = False
- Me.Text = "VB.NET之WinForm编程托盘程序篇"
- '设定程序运行后最小化
- Me.WindowState = System.Windows.Forms.FormWindowState.Minimized
- End Sub
- #End Region
- '显示托盘程序窗口
- Private Sub MenuItem1_Click ( ByVal sender As System.Object,ByVal e As System.EventArgs ) Handles MenuItem1.Click
- Me.WindowState = FormWindowState.Normal
- Me.Show ( )
- End Sub
- '隐藏托盘程序窗口
- Private Sub MenuItem2_Click ( ByVal sender As Object,ByVal e As System.EventArgs ) Handles MenuItem2.Click
- Me.Hide ( )
- End Sub
- '推出托盘程序窗口
- Private Sub MenuItem3_Click ( ByVal sender As Object,ByVal e As System.EventArgs ) Handles MenuItem3.Click
- NotifyIcon1.Dispose ( )
- Application.Exit ( )
- End Sub
- '双击图标显示窗体
- Private Sub NotifyIcon1_DoubleClick ( ByVal sender As Object,ByVal e As System.EventArgs ) Handles NotifyIcon1.DoubleClick
- Me.WindowState = FormWindowState.Normal
- Me.Show ( )
- End Sub
- End Class
- '启动程序
- Module Module1
- Sub Main ( )
- Application.Run ( new Form1 ( ) )
- End sub
- End Module
|
Form2.vb经过了下列命令编译、连接后:
Vbc /r:system.dll /r:system.windows.froms.dll /r:system.drawing.dll form2.vb
就可以得到Form2.exe,下图是From2.exe运行的界面:
图01:托盘程序运行界面01
动态托盘程序的编写过程
动态托盘程序中的托盘图标之所以能够呈现动画效果,是因为程序中的一个定时器组
件每隔一段时间都不断切换托盘图标。本文是通过二个图标的切换来表现动态效果的,读者如果有好的、连续的图标,也可以设定多个图标的切换,而这只需要修改Timer1定时器中的"Tick"事件中的代码就可以了。下面是此动态托盘程序的具体编制步骤:
要创建程序中的实例和变量:
- Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon
- Friend WithEvents ContextMenu1 As System.Windows.Forms.ContextMenu
- Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
- Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem
- Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem
- '创建Icon实例,用以切换图标
- Friend Icon1 = New Icon ( "icon1.ico" )
- Friend Icon2 = New Icon ( "icon2.ico" )
- '为不同图标的切换提供标识符
- Dim BeginFlag As Boolean = True
- '定时器
- Friend WithEvents Timer1 As System.Windows.Forms.Timer
|
初始化实例:
- Me.components = New System.ComponentModel.Container ( )
- Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon ( Me.components )
- Me.ContextMenu1 = New System.Windows.Forms.ContextMenu ( )
- Me.MenuItem1 = New System.Windows.Forms.MenuItem ( )
- Me.MenuItem2 = New System.Windows.Forms.MenuItem ( )
- Me.MenuItem3 = New System.Windows.Forms.MenuItem ( )
- Me.Timer1 = New System.Windows.Forms.Timer ( Me.components )
- Me.NotifyIcon1.ContextMenu = Me.ContextMenu1
- Me.NotifyIcon1.Text = "VB.NET的托盘程序"
- Me.NotifyIcon1.Visible = True
- '设定托盘程序托盘区位置显示缺省图标
- Me.NotifyIcon1.Icon = Icon1
- '在ContextMenu实例中加入菜单项
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem1 )
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem2 )
- Me.ContextMenu1.MenuItems.Add ( Me.MenuItem3 )
- Me.MenuItem1.Index = 0
- Me.MenuItem1.Text = "开始转动"
- Me.MenuItem2.Index = 1
- Me.MenuItem2.Text = "停止转动"
- Me.MenuItem3.Index = 2
- Me.MenuItem3.Text = "退出"
- Me.AutoScaleBaseSize = New System.Drawing.Size ( 6,273 )
- Me.Name = "Form1"
- Me.ShowInTaskbar = False
- Me.Text = "VB.NET之WinForm编程动态托盘程序"
- Me.WindowState = System.Windows.Forms.FormWindowState.Minimized
|
定义托盘程序中菜单项对应的事件,以及具体的处理方法:
- '开始托盘图标的转动
- Private Sub MenuItem1_Click ( ByVal sender As System.Object,ByVal e As System.EventArgs ) Handles MenuItem1.Click
- Timer1.Enabled = True
- End Sub
- '停止托盘图标的转动
- Private Sub MenuItem2_Click ( ByVal sender As Object,ByVal e As System.EventArgs ) Handles MenuItem2.Click
- Timer1.Enabled = False
- End Sub
- '关闭程序,清除托盘资源
- Private Sub MenuItem3_Click ( ByVal sender As Object,ByVal e As System.EventArgs ) Handles MenuItem3.Click
- NotifyIcon1.Dispose ( )
- Application.Exit ( )
- End Sub
- '根据标识符,来确定托盘图标类型
- Private Sub Timer1_Tick ( ByVal sender As Object,ByVal e As System.EventArgs ) Handles Timer1.Tick
- If BeginFlag = True Then
- NotifyIcon1.Icon = Icon2
- BeginFlag = False
- Else
- NotifyIcon1.Icon = Icon1
- BeginFlag = True
- End If
- End Sub
|
至此编写动态托盘程序的主要步骤就介绍完了,和上面的静态托盘程序相同,在运行此程序的时候必须保证此程序当前目录存在二个Icon
文件,并且
名称为"Icon1.ico"和"Icon2.ico"。这里并没有给出动态托盘程序的完整
代码清单,读者只需要把上面这些关键步骤的
代码覆盖到Form2.vb中的相应位置就可以得到动态托盘程序的源程序
文件Form3.vb。这应该不算很难,下面是编译Form3.vb的命令:
- Vbc /r:system.dll /r:system.windows.froms.dll /r:system.drawing.dll form2.vb
|
成功编译、连接后就得到Form3.exe,下图是Form3.exe的运行界面:
图02:托盘程序运行界面02
总结
托盘程序是现在比较流行的一种程序类型。本文中介绍的二个程序,也是托盘程序中比较典型的二个,希望对各位了解并掌握编写托盘程序有所帮助。