用C++Builder实现任务栏图标动画效果
发表于:2007-07-01来源:作者:点击数:
标签:
主页: Windows平台为应用程序提供许多的特色功能,任务图栏就是一个非常实用和经典的一个。它不但可以节省任务栏的空间,还可以通过不同的图标或动画效果来说明程序的当前状态等的信息。Windows里没有直接提供任务栏图标动画效果的支持,所以要自己通过编码
主页:
Windows平台为应用程序提供许多的特色功能,任务图栏就是一个非常实用和经典的一个。它不但可以节省任务栏的空间,还可以通过不同的图标或动画效果来说明程序的当前状态等的信息。Windows里没有直接提供任务栏图标动画效果的支持,所以要自己通过编码实现,在这篇文章里大家可以看到其中一种实现任务栏图标动画效果的方法。
首先要了解一下有关任务栏图标编程的知识,要实现对任务栏图标的控制主要是通过Shell_NotifyIcon()函数进行。该函数的API声明如下:
BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
); |
参数dwMessage是指定进行什么样的动作,可选值有:NIM_ADD, NIM_DELETE, NIM_MODIFY, NIM_SETFOCUS, NIM_SETVERSION,分别代表为:添加、删除、修改、获得焦点、设置版本号,对于NIM_SETFOCUS,NIM_SETVERSION一般比较少用,我们最常使用的主要是NIM_ADD ,NIM_DELETE, NIM_MODIFY。
另一个参数lpdata是一个
NOTIFYICONDATA结构的指针,这个结构内容比较多,定义如下:
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
#if (_WIN32_IE < 0x0500)
TCHAR szTip[64];
#else
TCHAR szTip[128];
#endif
#if (_WIN32_IE >= 0x0500)
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
} DUMMYUNIONNAME;
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
#endif
#if (_WIN32_IE >= 0x600)
GUID guidItem;
#endif
} NOTIFYICONDATA, *PNOTIFYICONDATA;
|
在这里我们主要留意上面粗体的成员
cbSize,
hWnd,
uID,
uFlags,
uCallbackMessage,
hIcon,
szTip等的内容及用法。分别代表的意思是:结构体大小,窗口句柄,图标标识,回调函数,所包含的内容标志,图标句柄,文本提示。
我们要定义自己的通知消息和图标标识来进行处理,内容如下:(这些内容在窗体的头文件中定义)
const int WM_NC_NOTIFY = (WM_USER + 1); // 自定义的通知消息
const int WM_NC_TRAYID = (WM_USER + 2); // 自定义的图标标识 |
一般情况下,都是在用户把应用程序最小化后才在任务栏显示小图标,所以我们还必须捕获系统消息
WM_SYSCOMMAND中wParam参数所带最小化命令,然后再进行有关的处理。另外最重要的就是要捕获自定义通知消息WM_NC_NOTIFY了,这些内容定义如下:(在窗体类的private内定义)
BEGIN_MESSAGE_MAP
VCL_MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, WMSysCommand);
VCL_MESSAGE_HANDLER(WM_NC_NOTIFY, TMessage, WMNCNotify)
END_MESSAGE_MAP(TForm) |
为了要实现动画效果,我们就需要有一个ImageList和Timer对象。ImageList中存放了每一帧的图标,Timer是定时改变
NOTIFYICONDATA结构中的图标句柄来实现动画效果。主要建立几个功能函数实现,分别是添加图标AddTrayIcon(),修改图标ModifyTrayIcon(),删除图标DeleteTrayIcon()。
至于具体功能的实现细节这里就不费笔墨了,大家可以进行查看,该示例在BCB6 + Windows 2000下编译通过。欢迎交流!
原文转自:http://www.ltesting.net