王朝网络
分享
 
 
 

系统托盘编程完全指南(三)

王朝vc·作者佚名  2006-01-17
宽屏版  字体: |||超大  

系统托盘编程完全指南(三)

——实现气球式提示

编译/NorthTibet

下载源代码

托盘程序的信息提示通常是将鼠标光标移到托盘图标上之后,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。就我所知,目前还没有办法区分是超时还是单击了关闭按钮。下表中列出的是所有与气球提示相关的通知消息:

通知消息

描述

NIN_BALLOONSHOW

显示气球提示时发送

NIN_BALLOONHIDE

气球提示消失时发送;例如,当图标被删除,如果因为超时或是用户单击鼠标气球消失,此消息不会被发送

NIN_BALLOONTIMEOUT

当由于超时或者用户单击气球上的关闭按钮(X),使气球消失时发送此消息

NIN_BALLOONUSERCLICK

当用户在气球提示上或托盘图标上单击鼠标(此时气球处于显示状态)时发送此消息

在测试过程中,我发现一个奇特的现象:在Windows

XP中,只要你的托盘程序拥有焦点,气球提示便不会超时。显然,你只有转到其它应用程序,才能启动计时器。在Windows

2000里好像没有这个问题。

你可以用TrayTest3来看通知消息。实际上,TrayTest3的功能就是查看通知消息:当托盘通知消息到达时显示它们。查看的方法是先运行TrayTest3,单击初始对话框的"确认"按钮,然后双击托盘图标调出图一所示的窗口。用"查看|显示气球提示"菜单来让TrayTest3显示它的提示,然后当你关闭提示或等待超时的时候,你查看在主窗口中显示的什么通知消息。

最后时一点忠告:请不要滥用气球提示和托盘图标!很多程序员为了好玩和张扬个性而滥用托盘图标。请在只有真正需要它时才去做。不要让用户觉得你的程序很讨厌,这样他们会毫不犹豫地卸载这些屏幕垃圾。如果你真的必需实现托盘图标,至少要给用户一个选项来关掉它。(完)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有