MFC程序任務欄托盤圖標的實現

1.首先自定義函數

//添加任務欄托盤圖標,Tray托盤
BOOL CChatRoomDlg::TrayMyIcon(BOOL bAdd)//bAdd爲TRUE就添加,bAdd爲FALSE就不添加。
{
    BOOL bRet = FALSE;
    NOTIFYICONDATA tnd;
    tnd.cbSize = sizeof(NOTIFYICONDATA);
    tnd.hWnd = GetSafeHwnd();//就是m_hWnd
    tnd.uID = IDR_MAINFRAME;
    if(bAdd == TRUE)
    {
        tnd.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;//uFlags這個參數爲了標識下面的哪個參數可用
        tnd.uCallbackMessage = WM_TRAYICON_MSG;//NIF_MESSAGE,任務欄托盤圖標在被鼠標點擊時觸發的消息
        tnd.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));//NIF_ICON
        //_tcscpy_s(tnd.szTip,sizeof(tnd.szTip),_T("聊天室v1.0"));//NIF_TIP
        memcpy(tnd.szTip,_T("聊天室v1.0"),sizeof(tnd.szTip));
        ShowWindow(SW_MINIMIZE);//把窗口最小化。
        ShowWindow(SW_HIDE);//只是把程序窗口隱藏了。(界面的可視化設計其實就是一層窗戶紙,捅破了就好了)
        bRet = Shell_NotifyIcon(NIM_ADD,&tnd);//添加任務欄托盤圖標
    }
    else
    {
        ShowWindow(SW_SHOWNA);//顯示窗口
        SetForegroundWindow();//把程序窗口設置成前景圖標
        bRet = Shell_NotifyIcon(NIM_DELETE,&tnd);//刪除任務欄托盤圖標
    }
    return bRet;
}


2.下面的函數是自定義的動態菜單的命令響應函數,在命令響應函數中調用TrayMyIcon();函數就可以實現點擊該菜單時,程序界面消失,在任務欄托盤中顯示一個圖標。

//添加任務欄托盤圖標
void CChatRoomDlg::OnMenuitemtray()
{
    TrayMyIcon();
}


3.添加鼠標移動到任務欄托盤圖標上時的自定義消息

#define WM_TRAYICON_MSG (WM_USER+100)//任務欄圖標顯示的消息(nd.uCallbackMessage = WM_TRAYICON_MSG;)

在消息映射中添加消息和消息響應函數的映射

ON_MESSAGE(WM_TRAYICON_MSG, OnTrayCallBackMsg)

下面是定義的是響應該消息的回調函數

//任務欄托盤圖標的響應函數,鼠標只要放到任務欄托盤圖標,就會觸發WM_TRAYICON_MSG,消息調用這個函數
LRESULT CChatRoomDlg::OnTrayCallBackMsg(WPARAM wparam, LPARAM lparam)
{
    switch(lparam)
    {
    case WM_RBUTTONUP://鼠標右鍵單擊的消息
        {
            CMenu mMenu,*pMenu = NULL;
            CPoint pt;
            mMenu.LoadMenu(IDR_MENU2);
            pMenu = mMenu.GetSubMenu(0);
            GetCursorPos(&pt);
            SetForegroundWindow();//不加這一段代碼可能出現右鍵菜單不消失的現象
            pMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,pt.x,pt.y,this);
            break;
        }
    case WM_LBUTTONDBLCLK://鼠標左鍵雙擊的消息
        {
           ShowWindow(SW_RESTORE);
        }
        SetForegroundWindow();
        TrayMyIcon(FALSE);
        break;
    default:
        break;
    }
    return NULL;
}


至此就可以實現程序任務欄托盤圖標的顯示了,可以在switch中增加其他的消息響應。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章