65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.65/5 (24投票s)

2006年7月14日

2分钟阅读

viewsIcon

94077

downloadIcon

4210

一篇关于动画系统托盘、任务栏和标题栏图标的文章。

Sample ImageSample Image

任务栏图标动画

Sample Image

标题栏图标动画

Sample Image

引言

我遇到过许多在系统托盘、任务栏或标题栏上显示图标的解决方案,但我找不到在不使用 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 时,第一个参数将标识消息类型,例如

  1. NIM_ADD
  2. NIM_MODIFY
  3. 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 函数来加载菜单并在托盘图标中显示它。菜单包含以下功能

  1. 杀死进程
  2. 最小化窗口
  3. 最大化窗口
  4. 隐藏窗口

菜单操作的功能应在 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);
}
© . All rights reserved.