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

原创 2017年09月29日 05:58:47

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

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是项目中图标资源的IDuFlags的值中,NIF_ICONNIF_MESSAGENIF_TIP分别表示结构的hIconuCallbackMessageszTip三个成员变量将被使用;WM_SHOWTASK是自定义消息,当在任务栏的IDI_ICON1图标范围内发生鼠标动作,则该消息将会被发送给程序主窗口。

1.2 Shell_NotifyIcon()函数

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

BOOL Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYICONDATA lpdata
);
其中,参数dwMessage表示向任务栏状态区域发送的消息,该消息可以是添加图标、删除图标和修改图标等消息,系统收到不同的消息进行不同的处理;lpdataNOTIFYICONDATA结构的指针,包含了任务栏图标的相关信息。如果发送消息成功,则返回值为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对话框程序启动的时候直接隐藏、在任务栏不显示图标

2011-06-19以前做一个项目,要求程序启动的时候主对话框是隐藏的。当时不知道怎么做,修改窗口风格、窗口类、OnInitDialog里ShowWindow、Create函数、WM_CREATE消息...

MFC修改任务栏,窗口和exe图标

最近开始学习MFC,发现程序在任务栏,窗口和exe都使用的默认图标,那么,我们想使用自己的图标该如何做? 1、我们将自己要使用的icon的图标导入项目中。 资源视图--》xx.rc(xx代表项目的...

解决Java程序的托盘图标在Windows任务栏重建后丢失的问题(使用SystemTray类创建托盘图标)

JavaSE 1.6提供了java.awt.SystemTray类用于方便地创建托盘图标.但在Windows平台下当explorer崩溃时托盘图标会丢失. 如果是本地代码或.Net平台的程序则可以很...
  • ycb1689
  • ycb1689
  • 2012年04月26日 18:34
  • 720

使任务栏上的程序图标闪烁

  • 2013年10月29日 15:35
  • 2.09MB
  • 下载

win7下如何把程序图标添加到任务栏…

win7下如何把程序图标添加到任务栏,用鼠标点住程序的图标拖拽到屏幕底部的任务栏中,系统会出现附到任务栏的提示,这时松开鼠标,程序就可以固定在任务栏中了 从开始菜单添加 点击桌面左下侧的开始菜单,...
  • rxm1989
  • rxm1989
  • 2014年09月25日 13:24
  • 656

QT 实现一个任务栏托盘图标程序 weathertrayicon

int main(intargc,char*argv[]) { QApplication app(argc, argv); app.setApplicationName(...

任务栏通知区域(Tray)图标程序

  • 2014年06月13日 11:40
  • 500KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC中使用任务栏显示图标表示程序
举报原因:
原因补充:

(最多只允许输入30个字)