 |
Tray中文直译为“托盘”,不过我个人认为译作“状态区”也许更好。Tray也称作SysTray、TrayIcon、NotifyIcon、Status Area等,它是Windows 95/NT的任务条上一个特殊区域(下图),许多软件运行时在Tray中加入自己的图标,如果用户点击这个图标,软件会实现相应的功能,如果用户鼠标箭头在图标上停留,Windows 95会显示出相应的工具提示(ToolTip)。这个区域的另一个特殊之处在于你可以从资源管理器内拖文件然后放在这个区域。正是由于这些特性,Tray编程在Windows 95/NT中有特殊的地位。
Tray编程主要包括三个主要方面:图标、工具提示和消息。它属于Shell编程的一部分,主要是利用Shell API中的Shell_NotifyIcon函数完成的。Shell_NotifyIcon函数是这样定义的:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message dentifier
PNOTIFYICONDATA pnid // pointer to structure
);
dwMessage有三种取值:NIM_ADD、NIM_DELETE和NIM_MODIFY,分别表示添加、删除和修改指定的图标。pnid 是一个指向NOTIFYICONDATA 结构的指针,它的内容因dwMessage参数而异。NOTIFYICONDATA 结构的定义如下:
typedef struct _NOTIFYICONDATA { // nid
DWORD cbSize;// 结构所占的字节数
HWND hWnd; // 接受Tray图标消息的窗口句柄
UINT uID; // 由应用程序定义的图标识别符
UINT uFlags; // 标志
UINT uCallbackMessage; // 应用程序定义的消息
HICON hIcon; // Tray图标的句柄
char szTip[64]; // 工具提示字符串
} NOTIFYICONDATA;
这个结构中的uFlags很重要,它有三种取值:NIF_ICON、NIF_MESSAGE和NIF_TIP,分别表示hIcon、uCallbackMessage和szTip参数有效,用来修改图标、消息和工具提示。这三个取值可以同时使用(三个参数相或),也可以单独使用。为了实现对用户鼠标操作的响应,需要在程序中处理uCallbackMessage所定义的消息,该消息的长参数lParam包含Win32所定义的鼠标消息,如果有多个图标,短参数wParam表示图标识别符。在Borland C++ 5.0的EXAMPLES\WIN95\TRAYNOT目录下有一个简单的示例程序(这是Win32 SDK的示范程序,一般的C语言软件包都包括此程序)详细地展示了具体操作,参照前面的介绍,相信你可以轻松地完成自己的程序。
这里顺便说一句,Visual Basic的用户可以从http://www.mvps.org/vbnet/code/subclass/shellnotifybasic.htm下载关于Tray编程的Visual Basic示范代码。 参考QA000528 "程序运行时能缩成图标并进入状态栏的右端"。
可以在此下载Delphi例子 AnimatedTrayIcon.zip。
许多软件,如杀毒软件当在托盘中显示图标时,会隐藏主程序,这很容易实现,你只要隐藏主窗口就可以,在VB、DELPHI中只需要将主窗口的Visible属性设置为False即可。
闫新海的意见:
我这有一个类(C++) systemtray.zip,使用起来非常方便。
相关问题:
QA004825 "实时错误'453':找不到DLL入口点 Shell_NotifyIconA in shell32.dll"
QA004827 "如何编写任务栏提示信息:"气泡式窗口""
此问题由李海回答。
附加关键字:编程, 源程序, programming, source code, C/C++, MFC, C++ Builder, Borland C++, Turbo C, C, BCB, Delphi, VCL, Borland, Visual Basic, VB, Windows API, win32, api, windows api, gdi32, kernel。
|