void CTestDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { //增長關閉時最小化到托盤的函數 if (nID == SC_CLOSE) //SC_MINIMIZE { ToTray(); return; } CDialog::OnSysCommand(nID, lParam); } } BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_MESSAGE(WM_SHOWTASK, OnShowTask) //}}AFX_MSG_MAP END_MESSAGE_MAP() //在托盤區添加圖標 最小化到托盤函數 void ToTray(void); void CTestDlg::ToTray(void) { NOTIFYICONDATA nid; 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)); wcscpy_s(nid.szTip, _T("***程序"));//信息提示條 Shell_NotifyIcon(NIM_ADD, &nid);//在托盤區添加圖標 ShowWindow(SW_HIDE);//隱藏主窗口 } //恢復界面函數 afx_msg LRESULT OnShowTask(WPARAM wParam, LPARAM lParam); //托盤事件 LRESULT CTestDlg::OnShowTask(WPARAM wParam, LPARAM lParam) { if (wParam != IDR_MAINFRAME) { return 1; } switch(lParam) { case WM_RBUTTONUP://右鍵起來時彈出快捷菜單,這裏只有一個關閉 { LPPOINT lpoint = new tagPOINT; ::GetCursorPos(lpoint);//獲得鼠標位置 CMenu menu; menu.CreatePopupMenu();//聲明一個彈出式菜單 //增長菜單項「關閉」,點擊則發送消息WM_DESTROY給主窗口(已 //隱藏),將程序結束。 menu.AppendMenu(MF_STRING, WM_DESTROY, _T("退出")); //肯定彈出式菜單的位置 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);//簡單的顯示主窗口 this->ShowWindow(SW_RESTORE); DeleteTray(); } break; default: break; } return 0; } //刪除托盤中圖標 void DeleteTray(); void CTestlDlg::DeleteTray() { NOTIFYICONDATA nid; 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)); wcscpy_s(nid.szTip, _T("***程序"));//信息提示條爲「按計劃任務提醒」 Shell_NotifyIcon(NIM_DELETE, &nid);//在托盤中刪除圖標 } //退出程序需時須要DeleteTray(); void CTestDlg::OnDestroy() { CDialog::OnDestroy(); // TODO: 在此處添加消息處理程序代碼 DeleteTray(); } //修改風格使得他不在任務欄顯示 int CTestDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您專用的建立代碼 //修改風格使得他不在任務欄顯示 ModifyStyleEx(WS_EX_APPWINDOW, WS_EX_TOOLWINDOW); return 0; }
DeleteTray改成:函數
void CTestDlg::DeleteTray() { NOTIFYICONDATA nid; 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)); //wcscpy_s(nid.szTip, _T("***程序"));//信息提示條爲「按計劃任務提醒」 Shell_NotifyIcon(NIM_DELETE, &nid);//在托盤中刪除圖標 }
不然會出現程序退出後,托盤圖標還在的狀況,鼠標移動到圖標上後,圖標一閃而後消失的問題。this