CreateWindow托盘图标是Windows操作系统中实现托盘图标最常用的方法之一,该方法能够在任务栏或系统托盘区域中创建一个图标,以展示应用程序的状态或提供快捷方式。在本篇文章中,我们将详细介绍如何使用该方法创建托盘图标,并提供案例说明。
一、CreateWindow托盘图标的使用方法
1. 创建窗口
在使用CreateWindow托盘图标之前,首先需要创建一个窗口来容纳该图标。以下是创建窗口的一些基本代码:
```c++
HWND hWnd = CreateWindowA(szClassName, szTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL);
```
其中,szClassName和szTitle分别表示窗口类名和窗口标题;WS_VISIBLE和WS_OVERLAPPEDWINDOW表示窗口的可见性和风格;CW_USEDEFAULT表示窗口的默认坐标和大小;hInstance表示窗口所属的实例句柄。
2. 注册托盘图标
在窗口创建完成之后,需要向系统注册托盘图标,获取托盘图标的句柄。需要创建一个NOTIFYICONDATA结构体,并调用Shell_NotifyIcon函数来注册托盘图标。以下是一个简单的代码示例:
```c++
NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = ID_TRAYICON;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
nid.uCallbackMessage = WM_TRAYICON;
nid.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));
LoadString(hInstance, IDS_APPTITLE, nid.szTip, MAX_LOADSTRING);
Shell_NotifyIcon(NIM_ADD, &nid);
```
其中,ID_TRAYICON是托盘图标的ID号,WM_TRAYICON是自定义的消息号,IDI_MYICON是资源文件中的图标句柄,IDS_APPTITLE是资源文件中的应用程序标题。
3. 处理托盘图标消息
在注册完托盘图标之后,需要在程序的消息循环中处理托盘图标的消息,以便对用户的交互进行响应。以下是一个简单的代码示例:
```c++
MSG msg = { 0 };
while (GetMessage(&msg, NULL, 0, 0) > 0)
{
if (msg.message == WM_QUIT)
break;
if (msg.message == WM_TRAYICON)
{
switch (LOWORD(msg.lParam))
{
case WM_RBUTTONUP:
// 显示菜单
break;
case WM_LBUTTONUP:
// 显示窗口
break;
}
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
```
其中,WM_RBUTTONUP和WM_LBUTTONUP表示用户右键和左键单击托盘图标时的消息码。
4. 销毁托盘图标
在程序退出之前,需要销毁注册的托盘图标,以释放资源。以下是一个简单的代码示例:
```c++
NOTIFYICONDATA nid = { 0 };
nid.cbSize = sizeof(NOTIFYICONDATA);
nid.hWnd = hWnd;
nid.uID = ID_TRAYICON;
Shell_NotifyIcon(NIM_DELETE, &nid);
```
二、案例说明
以下是一个完整的案例,该案例演示了如何使用CreateWindow托盘图标在任务栏中创建一个简单的闹钟应用程序。
1. 创建工程
打开Visual Studio,选择新建工程,选择Win32控制台应用程序,并勾选空项目,创建一个空的工程。
2. 添加资源
在解决方案中右键选择添加,选择资源文件,选择编写一个新的资源文件。在资源视图中,右键选择新建菜单,选择图标,添加一个自定义的ICO文件作为应用程序的图标。
3. 编写代码
在工程中添加头文件和定义常量。在WinMain函数中添加窗口类的注册和窗口的创建。
```c++
#include #define WM_TRAYICON (WM_USER + 1) #define ID_TRAYICON 1 #define TIMER_SEC 2 LRESULT CALLBACK WindowProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow) { WNDCLASSEX wc = { 0 }; wc.cbSize = sizeof(WNDCLASSEX); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(COLOR_WINDOW); wc.lpfnWndProc = WindowProc; wc.lpszClassName = "MainWindow"; wc.hInstance = hInstance; RegisterClassEx(&wc); HWND hWnd = CreateWindow("MainWindow", "闹钟窗口", WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInstance, NULL); MSG msg = { 0 }; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ``` 在窗口过程中添加托盘图标的注册和消息处理。在托盘图标相关的代码中,需要注意要添加一个定时器,以便每秒钟更新一下托盘图标上的时间。 ```c++ LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static ULONGLONG ullStart = 0; static BOOL bPulsed = FALSE; static int iCountdownSeconds = 12 * 60; // 默认倒计时12分钟 // 托盘图标结构体 static NOTIFYICONDATA nid = { 0 }; nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = ID_TRAYICON; nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; switch (message) { case WM_CREATE: SetTimer(hWnd, TIMER_SEC, 1000, NULL); // 加载托盘图标 nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON)); LoadString(GetModuleHandle(NULL), IDS_APPTITLE, nid.szTip, MAX_LOADSTRING); Shell_NotifyIcon(NIM_ADD, &nid); break; case WM_TIMER: // 定时更新托盘图标的时间 if (ullStart == 0) ullStart = GetTickCount64(); ULONGLONG ullElapsed = (GetTickCount64() - ullStart) / 1000; int iHours = iCountdownSeconds / 3600; int iMinutes = (iCountdownSeconds % 3600) / 60; int iSeconds = iCountdownSeconds % 60; char szTip[64]; if (!bPulsed) { sprintf_s(szTip, sizeof(szTip), "倒计时:%02d:%02d:%02d", iHours, iMinutes, iSeconds); nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON_RED)); } else { sprintf_s(szTip, sizeof(szTip), "倒计时:%02d:%02d:%02d", iHours, iMinutes, iSeconds); nid.hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(IDI_MYICON)); } LoadString(GetModuleHandle(NULL), IDS_APPTITLE, nid.szTip, MAX_LOADSTRING); nid.uFlags |= NIF_INFO; nid.dwInfoFlags = NIIF_INFO; strcpy_s(nid.szInfo, sizeof(nid.szInfo), szTip); Shell_NotifyIcon(NIM_MODIFY, &nid); if (iCountdownSeconds > (int)ullElapsed) { iCountdownSeconds = iCountdownSeconds - ullElapsed; } else { iCountdownSeconds = 0; PostQuitMessage(0); } bPulsed = !bPulsed; break; case WM_DESTROY: KillTimer(hWnd, TIMER_SEC); // 销毁托盘图标 Shell_NotifyIcon(NIM_DELETE, &nid); PostQuitMessage(0); break; case WM_TRAYICON: switch (LOWORD(lParam)) { case WM_RBUTTONUP: // 显示菜单 break; case WM_LBUTTONUP: // 显示窗口 break; } break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } ``` 4. 编译运行 在Visual Studio中按下F5编译并运行程序。在任务栏中会出现一个托盘图标,该图标会每秒钟更新一下倒计时的时间。在用户单击或右键单击图标时,可以进行相应的操作,如显示菜单或显示窗口。 三、总结 CreateWindow托盘图标是实现Windows应用程序托盘图标的一种常用方法,该方法可以让应用程序在任务栏或系统托盘区域中创建一个图标,以展示应用程序的状态或提供快捷方式。通过以上的介绍和案例,相信读者已经了解了如何使用CreateWindow托盘图标,并可以在自己的应用程序中实现托盘图标的功能。 壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。 我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复