Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9727994
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 21:39:40

系统托盘编程完全指南(三)
——实现气球式提示

编译/



托盘程序的信息提示通常是将鼠标光标移到托盘图标上之后,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你想要做什么。下面是这个结构的定义的最新版本(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条件定义,因此在编译时,请注意包含最新版本的头文件shellapi.h,并保证链接最新版本的库文件shell32.lib,分发程序时用最新版本的运行时动态链接库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);

}      
这个函数很容易理解,同时也够繁琐的,要把文本串载缓冲里拷来拷去。缺省的dwInfoFlags设置为NIIF_INFO,在文本旁边显示信息图标;其它可能的标志是NIIF_ERROR——表示出错,NIIF_WARNING——表示警告,NIIF_NONE——没有图标。有关修改后的CTrayIcon以及TrayTest3源代码请下载本文的例子。
只有一种方法可以显示气球提示(Shell_NotifyIcon),但终止的方法有多种。用户可以在气球上单击鼠标,也可以单击关闭按钮(在Windows 2000里没有关闭按钮,如图一),或者Windows用超时机制来终止气球提示。那么是如何知道所发生的事件是什么呢?每当创建托盘图标时,你可以提供一个HWND和消息ID来接收事件发生的通知。如果用户单击气球提示,Windows发送NIN_BALLOONUSERCLICK;如果超时或者单击关闭按钮,Windows则发送NIN_BALLOONTIMEOUT。就我所知,目前还没有办法区分是超时还是单击了关闭按钮。下表中列出的是所有与气球提示相关的通知消息:
通知消息
阅读(366) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~