系统托盘编程xx指南(三) ——实现气球式提示
托盘程序的信息提示通常是将鼠标光标移到托盘图标上之后,Windows会发送消息给托盘程序,从而显示提示信息——Tooltip。但在Windows XP中我们还看到有些系统托盘程序是自动显示ToolTips信息的,也就是说不用将鼠标光标移到托盘图标上便可显示ToolTips,在这是怎么实现的呢?本文将示范一种新奇的ToolTips风格,它叫做气球提示:Balloon Tips。 Windows中与托盘图标相关的提示有两类:一类是传统的信息提示方式,当光标移到图标上时显示;另一类是新式的信息提示即气球提示,它是由你的程序来控制显示。气球提示有点像连环漫画中的文字气球。如图一、图二分别为本文例子程序TrayTest3在Windows 2000和Windows XP中运行的画面: 在Windows 2000中运行的气球提示,没有关闭按钮。 图一 在Windows 2000运行 在Windows XP中运行。 图二 在 Windows XP中运行的TrayTest3 气球提示为托盘程序提供了一种非打扰式的方法通知用户发生了某件事情。但是如何让气球提示显示出来呢?所有的托盘图标行为都是通过一个单纯的API函数Shell_NotifyIcon来操作的。这个函数的一个参数是NOTIFYICONDATA结构,你可以利用这个结构来告诉Windows你想要做什么。下面是这个结构的定义的{zx1}版本(For IE5.0+),其中已经加入了新的成员:
typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; #if (_WIN32_IE < 0x0500) WCHAR szTip[64]; #else WCHAR szTip[128]; #endif #if (_WIN32_IE >= 0x0500) DWORD dwState; DWORD dwStateMask; WCHAR szInfo[256]; union { UINT uTimeout; UINT uVersion; } DUMMYUNIONNAME; WCHAR szInfoTitle[64]; DWORD dwInfoFlags; #endif } NOTIFYICONDATA, *PNOTIFYICONDATA;
有关这个结构的详细信息和用法请参考本文前面的两个部分: 在NOTIFYICONDATA.uFlags中的标志之一是NIF_TIP,用它来设置传统的信息提示,即鼠标要移动到图标上。新的标志NIF_INFO(由于_WIN32_IE >= 0x0500条件定义,因此在编译时,请注意包含{zx1}版本的头文件shellapi.h,并保证链接{zx1}版本的库文件shell32.lib,分发程序时用{zx1}版本的运行时动态链接库shell32.dll)便是为显示气球提示所用的。也就是说,要显示气球提示,那么在调用Shell_NotifyIcon函数时必须用NIF_INFO标志。提示文本填入szInfo域,标题文本填入szInfoTitle。你甚至可以在NOTIFYICONDATA.uTimeout中设置一个超时时间,当经过指定的毫秒数之后,气球提示自动隐藏。 为了示范气球提示的实现原理,我对本文前面两个部分的例子以及CTrayIcon类进行了修改。CTrayIcon类中添加了一个新的方法ShowBalloonTip,这个方法有两个重载函数,既可以用文本串来调用,也可以用资源ID来调用。用资源ID时,可以有选择地加载文本串,并调用ShowBalloonTip的文本串版本,原型如下:
BOOL CTrayIcon::ShowBalloonTip(LPCTSTR szMsg, LPCTSTR szTitle, UINT uTimeout, DWORD dwInfoFlags) { m_nid.cbSize=sizeof(NOTIFYICONDATA); m_nid.uFlags = NIF_INFO; m_nid.uTimeout = uTimeout; m_nid.dwInfoFlags = dwInfoFlags; strcpy(m_nid.szInfo,szMsg ? szMsg : _T("")); strcpy(m_nid.szInfoTitle,szTitle ? szTitle : _T("")); return Shell_NotifyIcon(NIM_MODIFY, &m_nid); }