top
Loading...
用VB實現窗口圖標最小化到通知欄

如何做到當我們單擊窗口的最小化按鈕時,窗口先最小化到任務欄成為按鈕,然后消失,圖標顯示到通知欄呢?大家熟悉的FoxMail能做到,我們也可以做到。

只要我們能截獲最小化這個事件發送給窗口的消息,然后換成我們自定義的過程,問題就解決了。大家仔細想一想,當按下最小化按紐時會引發什么事件?最小化時窗口大小會發生變化會引發Form1.Resize事件,我們只要在Form1.Resize事件里用Form1.Visible = False使窗口消失,然后將窗口圖標顯示到通知欄即可達到我們想要的效果。

怎樣判斷發生Resize事件時窗口是最小化狀態呢?VB里沒有現成的做法,我們可以用非富的API函數。API函數庫里有一個函數IsIconic(ByVal hwnd As Long),它就是專門判斷窗口是否已最小化的。這樣當Form產生Resize事件時,用IsIconic函數判斷一下窗口是否為最小化狀態,就可知道是否用戶按了最小化按鈕。

最關鍵的一步就是將圖標顯示在通知欄里,VB里沒有現成的做法,我們還得用API函數。API函數庫里有一個函數Shell_NotifyIcon(ByVal dwMessage As Long, lpData As NOTIFYICONDATA),是專門操作(包括添加、修改、刪除)通知欄里圖標的。

點一下通知欄圖標,會出現一些諸如"退出"、"顯示窗口"的彈出菜單,怎樣實現彈出菜單呢?這個很容易實現,因為點擊圖標會觸發圖標所在窗口的MouseDown事件,我們把彈出菜單觸發過程寫入Form1_MouseDown事件即可。具體例程如下:

第一步、為了增強程序的可移植性,我們新建一個模塊,取名為:NoticeIcon,在此模塊中定義一些常量、自定義類型、所需的API函數說明及操作通知欄圖標的三個自定義函數(添加、修改、刪除),模塊NoticeIcon具體代碼如下所示:

Public Const DefaultIconIndex = 1 '圖標缺省索引
Public Const WM_LBUTTONDOWN = &H201 '按鼠標左鍵
Public Const WM_RBUTTONDOWN = &H204 '按鼠標右鍵

Public Const NIM_ADD = 0 '添加圖標
Public Const NIM_MODIFY = 1 '修改圖標
Public Const NIM_DELETE = 2 '刪除圖標

Public Const NIF_MESSAGE = 1 'message 有效
Public Const NIF_ICON = 2 '圖標操作(添加、修改、刪除)有效
Public Const NIF_TIP = 4 'ToolTip(提示)有效

'API函數聲明
'圖標操作
Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
'判斷窗口是否最小化
Declare Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long
'
'設置窗口位置和狀態(position)的功能
Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long

'定義類型
'通知欄圖標狀態
Public Type NOTIFYICONDATA
cbSize As Long
hwnd As Long
uID As Long
uFlags As Long
uCallbackMessage As Long
hIcon As Long
szTip As String * 64
End Type

'函數定義
'添加圖標至通知欄
Public Function Icon_Add(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
'參數說明:iHwnd:窗口句柄,sTips:當鼠標移到通知欄圖標上時顯示的提示內容
'hIcon:圖標句柄,IconID:圖標Id號
Dim IconVa As NOTIFYICONDATA
With IconVa
.hwnd = iHwnd
.szTip = sTips + Chr$(0)
.hIcon = hIcon
.uID = IconID
.uCallbackMessage = WM_LBUTTONDOWN
.cbSize = Len(IconVa)
.uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
Icon_Add = Shell_NotifyIcon(NIM_ADD, IconVa)
End With
End Function
'刪除通知欄圖標(參數說明同Icon_Add)
Function Icon_Del(iHwnd As Long, lIndex As Long) As Long
Dim IconVa As NOTIFYICONDATA
Dim L As Long
With IconVa
.hwnd = iHwnd
.uID = lIndex
.cbSize = Len(IconVa)
End With
Icon_Del = Shell_NotifyIcon(NIM_DELETE, IconVa)
End Function
'修改通知欄圖標(參數說明同Icon_Add)
Public Function Icon_Modify(iHwnd As Long, sTips As String, hIcon As Long, IconID As Long) As Long
Dim IconVa As NOTIFYICONDATA
With IconVa
.hwnd = iHwnd
.szTip = sTips + Chr$(0)
.hIcon = hIcon
.uID = IconID
.uCallbackMessage = WM_LBUTTONDOWN
.cbSize = Len(IconVa)
.uFlags = NIF_MESSAGE Or NIF_ICON Or NIF_TIP
Icon_Modify = Shell_NotifyIcon(NIM_MODIFY, IconVa)
End With
End Function

作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗