作为Microsoft Windows系统中的一项重要功能,托盘常常被程序开发者用于展示程序运行情况、提供一些常用功能等。在Windows系统中,托盘图标使用的是NotifyIconData结构体。本文将会介绍如何使用NotifyIconData在Windows系统中显示自定义托盘图标。
1.获取托盘图标的句柄
在初始化托盘图标前,需要先获取托盘图标的句柄。句柄可以用来检索托盘图标并与之交互。获取方法如下所示:
```c++
HWND trayHwnd = FindWindow(_T("Shell_TrayWnd"), NULL);
HWND trayNotify = FindWindowEx(trayHwnd, NULL, _T("TrayNotifyWnd"), NULL);
HWND trayItem = FindWindowEx(trayNotify, NULL, _T("SysPager"), NULL);
trayItem = FindWindowEx(trayItem, NULL, _T("ToolbarWindow32"), NULL);
```
2.初始化NotifyIconData
NotifyIconData是一个结构体,可以用来设置托盘图标的属性。初始化NotifyIconData结构体时,需要设定一些基础属性,包括版本号、句柄、消息等。具体示例代码如下:
```c++
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hwnd;
nid.uID = ID_TRAY_ICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_TRAY_ICON;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_TRAY_ICON));
```
其中,cbSize字段需要设置为结构体的大小,hWnd字段是托盘图标所在窗口的句柄,uID字段是托盘图标的ID,uFlags字段是一个标志位,它用来指定NotifyIconData结构体中哪些字段包含有效数据,uCallBackMessage字段是用来接收托盘图标相关消息的窗口消息ID。
3.显示托盘图标
显示托盘图标的方法非常简单。只需要在初始化NotifyIconData之后,使用Shell_NotifyIcon函数即可。具体代码如下:
```c++
Shell_NotifyIcon(NIM_ADD, &nid);
```
4.显示/更改托盘图标的提示信息
除了显示托盘图标外,还可以设置托盘图标的提示信息。提示信息就是当鼠标移动到托盘图标上时显示的文本。这可以通过设置NotifyIconData结构体的szTip字段来实现。具体代码如下:
```c++
_tcscpy_s(nid.szTip, MAX_TIP_LENGTH, _T("这是一个自定义的托盘图标。"));
Shell_NotifyIcon(NIM_MODIFY, &nid);
```
5.更改托盘图标
在运行中,可能需要更改托盘图标,比如在不同状态下显示不同的图标。更改托盘图标也很简单。只需要使用Shell_NotifyIcon函数,设置uFlags的NIF_ICON标志位,并设置hIcon字段为新的图标即可。具体代码如下:
```c++
// 修改托盘图标为ERR_ICON
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ERR_ICON));
Shell_NotifyIcon(NIM_MODIFY, &nid);
```
6.删除托盘图标
最后,程序退出时需要删除托盘图标,否则会造成托盘图标一直存在的问题。删除托盘图标只需要使用Shell_NotifyIcon函数,并设置uFlags的NIM_DELETE标志位即可。具体代码如下:
```c++
Shell_NotifyIcon(NIM_DELETE, &nid);
```
总结
使用NotifyIconData显示自定义托盘图标非常简单。只需要完成下列步骤即可实现:
1.获取托盘图标句柄。
2.初始化NotifyIconData,并设置图标、提示信息等属性。
3.使用Shell_NotifyIcon函数显示托盘图标。
4.使用Shell_NotifyIcon函数更改/删除托盘图标。
通过这些方法,我们可以轻松地创建自己的托盘图标,并进行展示和交互。