用VB实现托盘动画图标
现在,程序员把自己开发的程序的静态图标放入托盘已不是难事,使用Visual C++、Visual Basic、Delphi等编程语言,借助于Windows API函数(Shell_NotifyIcon)可以很容易地实现对托盘图标的操作。
那么,如何在托盘中实现动态图标呢?本文将通过一个在托盘中交替显示笑脸/哭脸的实例来介绍用VB实现托盘中动画图标的方法和步骤。
1.可视部分设计
新建一个标准EXE项目,在窗体中设置如下控件:
⑴一个计时器(命名为timer1),其属性Enabled=False、Interval=100;
⑵一个弹出选单(命名为mMyPopMenu),设计时清除其“可视”检查框(右单击托盘动画图标时弹出);
⑶若干图画框(本例为2个),这些图画框名称相同(例如picture1),其Index属性值依次为0、1、2、...,Visible属性值均为False,Picture属性设置为循环显示的图标文件,如图1所示;
图1
⑷其它控件,根据程序实际功能需要设置。
2.编写程序代码
⑴在窗体的声明部分给出如下声明:
Private Type NOTIFYICONDATA
cbSize As Long
注释:指定NOTIFYICONDATA结构长度
hWnd As Long 注释:指定接收回调消息的窗体或控件的句柄
uId As Long
注释:指定放入托盘中的图标的ID标识
uFlags As Long
注释:指定要绘制的图标的属性
ucallbackMessage As Long
注释:指定一条自定义的回调消息
hIcon As Long
注释:指定要显示于托盘中的图标的句柄
szTip As String * 64
注释:指定图标的提示信息
End Type
Private Const NIF_ICON = &&H2
Private Const NIF_MESSAGE = &&H1
Private Const NIF_TIP = &&H4
Private Const NIM_ADD = &&H0
Private Const NIM_DELETE = &&H2
Private Const NIM_MODIFY = &&H1
Private Const WM_MOUSEMOVE = &&H200
Private Declare Function Shell_NotifyIcon Lib "shell32" _
Alias "Shell_NotifyIconA" (ByVal dwMessage As Long, _
pnid As NOTIFYICONDATA) As Boolean
Dim tb As NOTIFYICONDATA
⑵窗体加载时把图标放入托盘:
Private Sub Form_Load()
mMyPopMenu.Visible = False
注释:使弹出选单隐藏
mHide.Enabled = False
With tb
.cbSize = Len(tb)
.hWnd = Picture1(0).hWnd
.uId = 1&&
.uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
.ucallbackMessage = WM_MOUSEMOVE
.hIcon = Picture1(0).Picture
.szTip = "托盘动画图标演示" && Chr$(0)
End With
Shell_NotifyIcon NIM_ADD, tb
Timer1.Enabled = True
Me.Hide
App.TaskVisible = False
End Sub
⑶计时器每触发一次就修改一下托盘中的图标:
Private Sub timer1_Timer()
Static i As Integer
i =(i+1) Mod 2 注释:2 为图画框的个数
With tb
.cbSize = Len(tb)
.hWnd = Picture1(0).hWnd
.uId = 1&&
.uFlags = NIF_ICON
.hIcon = Picture1(i).Picture
End With
Shell_NotifyIcon NIM_MODIFY, tb
Timer1.Enabled = True
End Sub
⑷响应托盘中图标的鼠标事件:
Private Sub picture1_MouseMove(Index As Integer, _
Button As Integer, Shift As Integer, _
X As Single, Y As Single)
If X = &&H1E3C Then
Me.PopupMenu mMyPopMenu
End If
End Sub
⑸窗体卸载时删除托盘中的图标:
Private Sub Form_Unload(Cancel As Integer)
Timer1.Enabled = False
With tb
.cbSize = Len(tb)
.hWnd = Picture1(0).hWnd
.uId = 1&&
End With
Shell_NotifyIcon NIM_DELETE, tb
End Sub
⑹对弹出选单Click事件的响应代码:
根据选单的具体功能而定。
本程序在VB5下编译,Win98下运行通过。