CreateWindow托盘图标

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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(106) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部