程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB.NET >> VB.NET編程之托盤程序篇

VB.NET編程之托盤程序篇

編輯:VB.NET

托盤程序是指這樣一類程序:當程序運行後,會在系統的托盤區(也有說是狀態區域)創建此程序的圖標,使用者可以通過點擊圖標出現的菜單來控制程序的運行狀態。托盤程序有很多優點,如不占屏幕,後台運行,便於控制等。所以現在越來越多的程序都做成了托盤程序。在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 , 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

定義托盤程序中菜單項對應的事件,以及具體的處理方法:

'開始托盤圖標的轉動
  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總結

托盤程序是現在比較流行的一種程序類型。本文中介紹的二個程序,也是托盤程序中比較典型的二個,希望對各位了解並掌握編寫托盤程序有所幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved