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中增加其他的消息響應。