用VB实现托盘动画图标 (作者:车光宏 2000年10月18日 09:55)   现在,程序员把自己开发的程序的静态图标放入托盘已不是难事,使用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下运行通过。