程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++對話框系統托盤實現

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

編輯:C++入門知識

背景需求:

1、MFC對話框最小化時,只顯示系統右下角托盤圖標。

2、雙擊托盤,對話框還原。

3、右鍵點擊托盤,彈出“關閉”菜單,可關閉對話框。

 實現步驟:

1、創建MFC對話框程序(本例程序名為TaskbarIcon),屬性中設置“MinimizeBox”為true。

2、定義自定義消息宏。

[cpp]
#define NOTIFY_SHOW WM_USER+2500 

3、OnSysCommand(系統消息響應函數)添加對話框最小化執行代碼。
[cpp] view plaincopy
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; 
    } 
 
    //...系統自帶代碼 

4、托盤自定義消息響應

[cpp] 
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: 
        { 
            //雙擊左鍵的處理 
 
            //顯示界面   www.2cto.com
            ShowWindow(SW_SHOW); 
            //界面置頂 
            SetForegroundWindow(); 
 
            break; 
        } 
    } 
 
    return 0; 

5、關閉時刪除托盤圖標。

覆蓋(override)OnCancel函數。

[cpp] 
virtual void OnCancel(); 
 
void CTaskbarIconDlg::OnCancel() 

    //刪除任務欄圖標 
    NOTIFYICONDATA nid; 
    nid.hWnd=this->m_hWnd; 
    nid.uID=IDR_MAINFRAME; 
    Shell_NotifyIcon(NIM_DELETE, &nid); 
 
    CDialog::OnCancel(); 


作者:segen_jaa

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved