C++對話框系統托盤實現

jopen 12年前發布 | 27K 次閱讀 C/C++開發 C/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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!