转自:http://blog.sina.com.cn/s/blog_6b23bc700100pqrm.html
现在使用系统托盘图标的程序越来越多,尤其是需要长时间运行的程序。这并不是什么高深的技术,纯当做个笔记。
第一步:定义一个 NOTIFYICONDATA
结构变量 nid。NOTIFYICONDATA结构体定义可以在MSDN中查找,就不做多做介绍。
第二步:设置NOTIFYICONDATA变量属性:
nid.cbSize =sizeof(NOTIFYICONDATA);
nid.hWnd =m_hWnd;
nid.hIcon =m_hIcon;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;
m_nid.uID = IDR_MAINFRAME;//IDR_MAINFRAME是你自己导入的一个icon资源的ID
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
nid.uCallbackMessage =WM_NOTIFYICON;
//#define WM_NOTIFYICON (WM_USER +101) 自己定义
wcscpy(nid.szTip, L"这是标签");
wcscpy(nid.szInfo, L"这是气泡提示消息");
wcscpy(nid.szInfoTitle, L"这是气泡提示标题");
nid.dwInfoFlags = NIIF_INFO;
nid.uTimeout = 1000;
第三步:将图标显示到系统托盘,只需调用一个API即可完成.
Shell_NotifyIcon (NIM_ADD,&nid);
第四步:图标添加完成了,我们通常需要让它响应用户的各种操作。如双击显示窗体,右键弹出上下文菜单等.
首先,我们定义一个回调函数
LRESULT OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
//根据lParam判断相对应的事件
{
case WM_LBUTTONDBLCLK:
//如果左键双击托盘图标,则显示窗体
ShowWindow (SW_SHOWNORMAL );
SetForegroundWindow();
break;
case WM_RBUTTONUP:
//如果右键菜单弹起,则弹出菜单
CPoint pos;
GetCursorPos(&pos);
if(pMenuContext != NULL)
{
SetForegroundWindow();
//加这句是为了鼠标点击其他地方时,弹出的菜单能够消失
pMenuContext->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_RIGHTALIGN,pos.x+1,pos.y+1,this);
}
break;
}
return 0;
}
然后在BEGIN_MESSAGE_MAP 与END_MESSAGE_MAP 之间
添加
ON_MESSAGE (WM_NOTIFYICON ,&OnNotifyIcon)
进行消息映射就完成了
我们已经完成了对程序添加托盘图标,而且可以通过图标对应用程序进行一定的操作,但是当程序退出的时候,系统托盘图标并不会自动删除,所以我们还需要在 OnClose() 中调用::Shell_NotifyIcon (NIM_DELETE ,&nid);
删除托盘图标.
在此附上源码工程:
点我下载