MFC中使用任务栏显示图标表示程序最小化

在任务栏中通过图标表示应用程序,就是当按下应用程序窗口的最小化按键时,隐藏窗口,并在任务栏中显示图标表示该应用程序;当鼠标点击了任务栏中的图标时,显示窗口,并删除任务栏中的图标。

1 在任务栏中显示图标

通过NOTIFYICONDATA结构Shell_NotifyIcon()函数实现图标的显示。

1.1 NOTIFYICONDATA结构

该结构包含了系统所需的进程任务栏状态区域消息。该结构的成员变量较多,一般需要设置的变量有cbSizehWnduIDuFlagshIconuCallbackMessageszTip等。其中,

cbSize表示NOTIFYICONDATA结构的大小;

hWnd指定了接收通知消息的窗口句柄,该通知消息与任务栏中的图标相关;

uID指定了该操作任务栏中的哪个图标;

uFlags表示NOTIFYICONDATA结构中哪些成员变量需要设置;

hIcon指定了要在任务栏中添加、删除或者修改的图标句柄;

uCallbackMessage:指定了一个自定义的消息,当在任务栏显示的图标区域内发生鼠标动作时,该消息将会被发送给hWnd指定的窗口。通过该消息的响应函数,即可实现对鼠标动作的处理。

szTip表示鼠标在任务栏图标上时显示的提示信息。

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
nid.uCallbackMessage = WM_SHOWTASK;
nid.hIcon = AfxGetApp()->LoadIcon(IDI_ICON1);
strncpy(nid.szTip, ("键盘屏蔽"), sizeof("键盘屏蔽"));
nid.szTip[sizeof("键盘屏蔽")] = _T('\0');
其中,IDI_ICON1 是项目中图标资源的 ID uFlags 的值中, NIF_ICON NIF_MESSAGE NIF_TIP 分别表示结构的 hIcon uCallbackMessage szTip 三个成员变量将被使用; WM_SHOWTASK 是自定义消息,当在任务栏的 IDI_ICON1 图标范围内发生鼠标动作,则该消息将会被发送给程序主窗口。

1.2 Shell_NotifyIcon()函数

使用Shell_NotifyIcon()函数在任务栏中显示图标。该函数的作用是将消息发送给任务栏的状态区域,系统收到消息后,进行后续处理。Shell_NotifyIcon()函数的格式为

BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
其中,参数dwMessage 表示向任务栏状态区域发送的消息,该消息可以是添加图标、删除图标和修改图标等消息,系统收到不同的消息进行不同的处理; lpdata NOTIFYICONDATA 结构的指针,包含了任务栏图标的相关信息。如果发送消息成功,则返回值为 TRUE ,否则为 FALSE

Shell_NotifyIcon(NIM_ADD, &nid);
其中,NIM_ADD 表示向任务栏中添加图标,添加图标的相关信息保存在 nid 中。

2 最小化按键消息处理

当按下窗口最小化按键后,应该隐藏当前窗口,并且在任务栏中显示程序对应的图标。按下窗口最小化按键,会向系统发送WM_SYSCOMMAND消息。通过ON_WM_SYSCOMMAND宏指定该消息的响应函数,该消息的响应函数为OnSysCommand()。以上消息映射宏及消息响应函数在程序创建时已经自动创建完毕。

OnSysCommand()函数的格式为

afx_msg void OnSysCommand(
   UINT nID,
   LPARAM lParam
);
其中,参数nID 表示收到的系统指令的类型; lParam 表示鼠标在系统指令菜单上的坐标。在该函数中,对 nID 的类型进行判断,如果按下的是最小化按键,则隐藏窗口,并且在任务栏中显示程序对应的图标。

if (nID == SC_MINIMIZE)
{
ShowWindow(SW_HIDE);
HideToTray();
}
其中,SC_MINIMIZE 表示按下了最小化按键, ShowWindow() 函数的作用是隐藏当前窗口, HideToTray() 函数的功能是在任务栏中显示图标。

3 任务栏图标鼠标动作的响应

在前面已经提到,当鼠标点击任务栏图标后,显示程序主窗口并且在任务栏中删除图标。对于鼠标点击的响应,NOTIFYICONDATA结构的uCallbackMessage成员变量指定了发生鼠标动作时发送的消息。接下来对该消息进行响应。

3.1 声明消息响应函数

在头文件中对消息响应函数进行声明。

LRESULT OnShowTask(WPARAM wParam, LPARAM lParam);

3.2 消息响应宏

在执行文件中使用ON_MESSAGE宏将消息与相应函数关联。

ON_MESSAGE(WM_SHOWTASK, OnShowTask)

3.3 定义消息响应函数

消息响应函数的两个参数wParamlParam分别表示鼠标动作所在任务栏图标的ID和鼠标动作对应的消息。

if (wParam != IDI_ICON1)
{
return -1;
}
switch (lParam)
{
case WM_LBUTTONUP:
ShowWindow(SW_SHOW);
HideFromTray();
break;
default:
break;
}
其中,IDI_ICON1 是在 NOTIFYICONDATA 结构的 uID 成员变量的值。当鼠标点击了状态栏中图标时,显示程序主窗口。 HideFromTray() 函数为自定义函数,该函数的作用是从任务栏中删除程序对应的图标,该函数的定义为

NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = this->m_hWnd;
nid.uID = IDI_ICON1;
nid.uFlags = 0;
Shell_NotifyIcon(NIM_DELETE, &nid);
其中,Shell_NotifyIcon() 函数的第一个参数为 NIM_DELETE ,表示从任务栏中删除程序对应的图标。

你可能感兴趣的:(MFC编程,MFC,NOTIFYICONDATA,NIM_ADD,NIM_DELETE)