C++對話框系統托盤實現
背景需求:
1、MFC對話框最小化時,只顯示系統右下角托盤圖標。
2、雙擊托盤,對話框還原。
3、右鍵點擊托盤,彈出“關閉”菜單,可關閉對話框。
實現步驟:
1、創建MFC對話框程序(本例程序名為TaskbarIcon),屬性中設置“MinimizeBox”為true。
2、定義自定義消息宏。
#define NOTIFY_SHOW WM_USER+2500
3、OnSysCommand(系統消息響應函數)添加對話框最小化執行代碼。
void CTaskbarIconDlg::OnSysCommand(UINT nID, LPARAM lParam) { if (SC_MINIMIZE == nID) { 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 = NOTIFY_SHOW;//自定義的消息名稱 nid.hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
wcscpy_s(nid.szTip, _T("圖標測試"));//信息提示條Shell_NotifyIcon(NIM_ADD,&nid);//在托盤區添加圖標 ShowWindow(SW_HIDE);//隱藏主窗口 return; } //...系統自帶代碼
}</pre>
4、托盤自定義消息響應
BEGIN_MESSAGE_MAP(CTaskbarIconDlg, CDialog) //...省略其他消息映射ON_MESSAGE(NOTIFY_SHOW, OnTrayIcon) //}}AFX_MSG_MAP
END_MESSAGE_MAP()
afx_msg LRESULT OnTrayIcon(WPARAM wParam, LPARAM lParam);
LRESULT CTaskbarIconDlg::OnTrayIcon(WPARAM wParam, LPARAM lParam) { if (wParam != IDR_MAINFRAME) { return 1; }
switch(lParam) { case WM_RBUTTONUP: { //右鍵起來時彈出快捷菜單,這里只有一個“關閉” //聲明一個彈出式菜單 //增加菜單項“關閉”,點擊則發送消息WM_CLOSE給主窗口(已 //隱藏),將程序結束。 CMenu menu; menu.CreatePopupMenu(); menu.AppendMenu(MF_STRING, ID_APP_EXIT, _T("關閉")); //得到鼠標位置 LPPOINT lpoint= new tagPOINT; ::GetCursorPos(lpoint); //確定彈出式菜單的位置 menu.TrackPopupMenu(TPM_LEFTALIGN, lpoint->x, lpoint->y,this); //資源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); delete lpoint; lpoint = NULL; break; } case WM_LBUTTONDBLCLK: { //雙擊左鍵的處理 //顯示界面 ShowWindow(SW_SHOW); //界面置頂 SetForegroundWindow(); break; } } return 0;
}</pre>
5、關閉時刪除托盤圖標。
覆蓋(override)OnCancel函數。
virtual void OnCancel();void CTaskbarIconDlg::OnCancel() { //刪除任務欄圖標 NOTIFYICONDATA nid; nid.hWnd=this->m_hWnd; nid.uID=IDR_MAINFRAME; Shell_NotifyIcon(NIM_DELETE, &nid);
CDialog::OnCancel();
}</pre>
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!