一、简介:
使程序托盘我们这里要用到了一个结构体NOTIFYICONDATA,它包含了系统需要用来传递托盘区域信息的消息;还有需要用到一个函数Shell_NotifyIcon,它的作用是对拖盘图标进行显示与删除。
NOTIFYICONDATA结构如下:
STRUCT NOTIFLYICONDATA { cbSize //结构体的大小,以字节为单位 hIcon //任务栏上显示的图标 hWnd //窗口句柄 uCallbackMessage //自义定消息处理,当你对托管图标操作时,响应这消息 uFlags //作用标识,比如你想让图标起作用可以用NIF_ICON ,想显示提标信息可用NIF_TIP uID //图标ID szTip //鼠标放上去的提示信息 };
二、具体实现步骤:
1、定义NOTIFYICONDATA对象,
private: NOTIFYICONDATA nid;
2、初始化对象
nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA); nid.hWnd=this-> m_hWnd; nid.uID=IDR_MAINFRAME; nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ; nid.uCallbackMessage = WM_SHOWTASK;//自定义的消息名称 nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip, _T("xxx"));//信息提示条 Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标
3、自定义用户消息、并添加回调函数
#define WM_SHOWTASK (WM_USER + 100) afx_msg LRESULT OnShowTask(WPARAM wParam,LPARAM lParam); LRESULT CQueueServerDlg::OnShowTask(WPARAM wParam,LPARAM lParam) //wParam是图标的ID,lParam是鼠标的行为 { if(wParam != IDR_MAINFRAME) { return 1; } switch(lParam) { case WM_RBUTTONUP://右键起来时弹出快捷菜单 { LPPOINT lpoint=new tagPOINT; ::GetCursorPos(lpoint);//得到鼠标位置 CMenu menu; menu.CreatePopupMenu();//声明一个弹出式菜单 menu.AppendMenu(MF_STRING,WM_DESTROY, "Close"); //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已隐藏)将程序结束。 SetForegroundWindow(); menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //确定弹出式菜单的位置 HMENU hmenu=menu.Detach(); //资源回收 menu.DestroyMenu(); delete lpoint; } break; case WM_LBUTTONDBLCLK: { this-> ShowWindow(SW_SHOW); } break; case WM_LBUTTONDOWN: this-> ShowWindow(SW_SHOW); break; } return 0; }
4、添加消息映射
BEGIN_MESSAGE_MAP(CSSDlg, CDialog) ON_MESSAGE(WM_SHOWTASK, &CQueueServerDlg::OnShowTask) END_MESSAGE_MAP()
5、最后在OnDestroy函数删除托盘图标。
Shell_NotifyIcon(NIM_DELETE,&nid);