动画系统托盘图标、任务栏图标和标题栏图标






4.65/5 (24投票s)
2006年7月14日
2分钟阅读

94077

4210
一篇关于动画系统托盘、任务栏和标题栏图标的文章。
任务栏图标动画
标题栏图标动画
引言
我遇到过许多在系统托盘、任务栏或标题栏上显示图标的解决方案,但我找不到在不使用 MFC 的情况下动画图标的代码。当我开始研究动画系统托盘图标时,我考察了是否可以在任务栏和标题栏图标上执行相同的操作。你可以找到许多“类”来集成到你的项目中以执行相同的操作。这个项目是在不使用 MFC 的情况下开发的;它是一个纯 Win32 “C” 代码,具有以下特性。
功能
- 托盘图标动画
- 任务栏图标动画
- 标题栏图标动画
- 托盘图标通知,带有菜单以控制应用程序窗口
系统托盘图标
首先,通过注册一个本地类创建一个简单的 Win32 应用程序。使用工作区创建一组自定义图标(.ico 文件)。
void DrawGraph(HDC hdc, RECT Rect);
DrawGraph
例程用于使用指定的设备上下文绘制图形。图形大小使用 Rect
参数指定。此外,图形的垂直移动也在此例程中实现。
void AnimateIcon(HINSTANCE hInstance, HWND hWnd,
DWORD dwMsgType,UINT nIndexOfIcon);
用户定义的函数 AnimateIcon
包含带有 NOTIFYICONDATA
结构的 Shell_NotifyIcon
API,用于在系统托盘上绘制图标。在使用 Shell_NotifyIcon
API 时,第一个参数将标识消息类型,例如
NIM_ADD
NIM_MODIFY
NIM_DELETE
NIM_ADD
用于将新图标添加到系统托盘,这在初始化时调用。NIM_MODIFY
消息用于修改特定的系统托盘图标,而 NIM_DELETE
用于从系统托盘中删除图标。AnimateIcon
函数的第三个参数表示消息类型。
void AnimateIcon(HINSTANCE hInstance, HWND hWnd, DWORD dwMsgType,UINT nIndexOfIcon) { HICON hIconAtIndex = LoadIcon(hInstance, (LPCTSTR) MAKEINTRESOURCE(IconResourceArray[nIndexOfIcon])); NOTIFYICONDATA IconData; IconData.cbSize = sizeof(NOTIFYICONDATA); IconData.hIcon = hIconAtIndex; IconData.hWnd = hWnd; lstrcpyn(IconData.szTip,"Animated Icons - Demo", (int) strlen("Animated Icons - Demo")+1); IconData.uCallbackMessage = MYMSG_NOTIFYICON; IconData.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; Shell_NotifyIcon(dwMsgType, &IconData); SendMessage(hWnd, WM_SETICON, NULL, (long) hIconAtIndex); if(hIconAtIndex) DestroyIcon(hIconAtIndex); }
MYMSG_NOTIFYICON
是回调通知消息。当光标在图标上执行任何操作时,将执行此回调函数。当我们右键单击托盘图标时,将发布 MYMSG_NOTIFYICON
消息。
case MYMSG_NOTIFYICON: OnTrayNotification(hInst, hWnd, wParam, lParam); break;
在此消息处理程序中,将调用 OnTrayNotification
函数来加载菜单并在托盘图标中显示它。菜单包含以下功能
- 杀死进程
- 最小化窗口
- 最大化窗口
- 隐藏窗口
菜单操作的功能应在 WndProc
回调例程中处理。
任务栏图标和标题栏图标
要在任务栏和标题栏上绘制自定义图标,请通过 LPARAM
参数传递图标句柄发送 WM_SETICON
消息。这将只是在栏上绘制一个图标。使用 DestroyIcon
函数,我们可以从栏中删除图标。为了动画化这些图标,创建了一个名为 TimerAnimationIcon
的计时器函数。这将从图标列表结构中选择下一个图标,并使用 NIM_MODIFY
消息标志调用 AnimateIcon
函数。现在,新图标通过覆盖以前的图标来显示。
void TimerAnimationIcon(HINSTANCE hInst, HWND hWnd)
{
AnimateIcon(hInst, hWnd, NIM_MODIFY, nCounter);
m_nCounter = nCounter;
nCounter++;
nCounter = nCounter%(NUM_ICON_FOR_ANIMATION);
}