通过定时器,可以实现系统托盘动态图标的效果。在程序启动时,首先设置图标列表,启动定时器,并设置托盘图标和托盘文字。定时器每次获取当前索引下的图标句柄,并调用Shell_NotifyIcon()函数设置托盘上的图标为获取的新图标,这样,看上去系统托盘上显示的是动态图标。代码如下:
- BOOL CMainFrame::SetSBImageList(int imageListID,int iMaxIcons, COLORREF tc)
- { // 设置图标列表
- if(iMaxIcons <= 0) return false; // 如果最大个数小于或等于0,则返回
- m_iMaxSBIcon = iMaxIcons; // 赋值保存图标个数
- VERIFY(m_SBImgList.Create(imageListID, 16, 1, tc)); // 创建图标列表
- hSBIcon = m_SBImgList.ExtractIcon(0); // 析出图标
- NOTIFYICONDATA nid;
- ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); // 初始化内存
- nid.cbSize = sizeof(NOTIFYICONDATA); // 赋值大小
- nid.hWnd = m_hWnd; // 赋值窗体句柄
- nid.uID = IDI_ICON_APP; // 赋值图标ID
- nid.uFlags = NIF_TIP | NIF_ICON | NIF_MESSAGE; // 赋值标记
- nid.uCallbackMessage = NULL; // 赋值回调消息
- nid.hIcon = hSBIcon; // 赋值图标句柄
- strcpyn(nid.szTip, __TEXT("托盘图标测试!"), 64); // 复制文本
- Shell_NotifyIcon(NIM_ADD, &nid); // 修改图标
- return true; // 函数成功返回
- }
上面的代码除了初始化图标列表外,调用Shell_NotifyIcon()函数设置启动时托盘上的图标为图标列表中的第一个图标,并设置当鼠标滑过托盘图标时的提示文字为"托盘图标测试!"。下面的代码是定时器执行函数。
- BOOL CMainFrame::ShowSBNextIcon() // 显示下一个图标
- {
- if(m_SBImgList.m_hImageList == NULL) return false;
- // 判断图标列表有效性
- m_iSBIconCounter++; // 索引技术增一
- if(m_iSBIconCounter >= m_iMaxSBIcon)m_iSBIconCounter =0;
- hSBIcon = m_SBImgList.ExtractIcon(m_iSBIconCounter); // 析出图标
- NOTIFYICONDATA nid;
- ZeroMemory(&nid, sizeof(NOTIFYICONDATA)); // 初始化内存
- nid.cbSize = sizeof(NOTIFYICONDATA); // 设置结构大小
- nid.hWnd = m_hWnd; // 设置窗体句柄
- nid.uID = IDI_ICON_APP; // 设置图标
- nid.uFlags = NIF_ICON;
- nid.hIcon = hSBIcon; // 设置图标句柄
- Shell_NotifyIcon(NIM_MODIFY, &nid); // 设置图标
- if (hSBPrevIcon) DestroyIcon(hSBPrevIcon); // 销毁句柄
- hSBPrevIcon = hSBIcon; // 保存图标句柄
- return true; // 函数成功返回
- }
上面代码会获取当前索引处的图标句柄,并通过Shell_NotifyIcon()函数的NIM_MODIFY命令来修改托盘上的图标,同时修改当前图标索引。