VC下添加和删除自己系统托盘图标,及托盘事件的响应
添加和删除系统托盘图标:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//需要添加一个成员变量 NOTIFYICONDATA m_nd; //NOTIFYICONDATA结构 /*************************************** * 将图标加入系统托盘 * 参数: * hWnd - 窗体句柄 * hIcon - 所要加入的图标句柄 * title - 悬停于系统托盘之上时所要显示的消息 * uCallbackMessage - 消息标识(需用户自己定义消息) ***************************************/ void CMyDlg::AddIcon(HWND hWnd, HICON hIcon, UINT uCallbackMessage, char *title) { m_nd.cbSize = sizeof(NOTIFYICONDATA); m_nd.hWnd = hWnd; m_nd.uID = IDR_MAINFRAME; m_nd.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; m_nd.uCallbackMessage = uCallbackMessage; m_nd.hIcon = hIcon; strcpy(m_nd.szTip, title); Shell_NotifyIcon(NIM_ADD, &m_nd); //加入图标 } //删除系统托盘图标 void CMyDlg::RemoveIcon() { Shell_NotifyIcon(NIM_DELETE, &m_nd); } |
下面就是为图标添加自己的响应消息:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//用户定义的消息(在相应头文件中加入) #define MYWM_NOTIFYICON WM_USER+1 //添加WinProc消息函数 LRESULT CMyCatchScreenDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: Add your specialized code here and/or call the base class switch(message) { case MYWM_NOTIFYICON: //如果是用户定义的消息 if(lParam==WM_LBUTTONDOWN) { //添加自己的函数 //鼠标单击图标时主窗口出现 //ShowMyWindow(); } else if(lParam==WM_RBUTTONDOWN) { //添加自己的函数 //鼠标右键单击弹出选单 /* CMenu menu; menu.LoadMenu(IDR_MY_MENU); //载入事先定义的选单 CMenu*pMenu=menu.GetSubMenu(0); CPoint pos; GetCursorPos(&pos); pMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON,pos.x,pos.y,AfxGetMainWnd()); */ } break; } return CDialog::WindowProc(message, wParam, lParam); } |
调用演示:
1 2 3 4 5 6 7 8 9 10 11 |
void CMyDlg::ShowMyWindow() { RemoveIcon(); //删除系统图标 ShowWindow(SW_SHOW); //显示窗口 } void CMyDlg::HideMyWindow() { ShowWindow(SW_HIDE); //隐藏窗口 AddIcon(m_hWnd,m_hIcon,MYWM_NOTIFYICON,"MyDlg"); //添加系统图标 } |
Trackback from your site.