在程序最小化時(shí),不在windows的任務(wù)欄中出現,而是在右下角的系統托盤(pán)中顯示一個(gè)小圖標,當鼠標單擊時(shí)顯示功能菜單,雙擊時(shí)打開(kāi)主界面。這就是系統托盤(pán)程序的一般功能,想qq和很多桌面搜索程序都是這么做了,給人的感覺(jué)比較清爽,不用的時(shí)候就縮在一個(gè)小角落里,用的時(shí)候也能很快的找到。
在技術(shù)實(shí)現上
首先是創(chuàng )建托盤(pán):
void CDiskSearchDlg::InitTray()
{
m_NotifyID.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
m_NotifyID.hWnd=this->m_hWnd;
m_NotifyID.uID=IDR_MAINFRAME;
m_NotifyID.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
m_NotifyID.uCallbackMessage=WM_NOTIFYICON;//自定義的消息名稱(chēng)
m_NotifyID.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_NotifyID.szTip,"桌面搜索");//信息提示
Shell_NotifyIcon(NIM_ADD,&m_NotifyID);//在托盤(pán)區添加圖標
}
上面的代碼就是一個(gè)一般創(chuàng )建的方法,其中定義NOTIFYICONDATA m_NotifyID;
WM_NOTIFYICON是自定義的消息,我們可以用
#define WM_NOTIFYICON WM_USE+5
來(lái)定義
調用InitTray()后會(huì )在托盤(pán)上出現一個(gè)小圖標,當然我們也同時(shí)要把任務(wù)欄中的程序任務(wù)去掉,只要調用ShowWindow(SW_HIDE)就可以了
接下來(lái)是創(chuàng )建一個(gè)菜單資源,假設為IDR_MENU_TP
然后要做的是添加WM_NOTIFYICON消息:
在BEGIN_MESSAGE_MAP(CDiskSearchDlg, CDialog)內要添加
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//手工添加托盤(pán)消息映射
并定義函數
LONG CDiskSearchDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
//wParam中是響應消息的圖標ID,lParam中則是Windows的消息
switch ( lParam )
{
case WM_RBUTTONDOWN:
{// 用戶(hù)在托盤(pán)圖標上單擊鼠標右鍵,彈出菜單
CMenu pMenu;
if (pMenu.LoadMenu(IDR_MENU_TP))
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;
GetCursorPos( &Point );
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
}
}
break;
case WM_LBUTTONDBLCLK:
// OnMenuitemShow();
break;
case WM_LBUTTONDOWN:
{// 用戶(hù)在托盤(pán)圖標上單擊鼠標右鍵,彈出菜單
CMenu pMenu;
if (pMenu.LoadMenu(IDR_MENU_TP))
{
CMenu* pPopup = pMenu.GetSubMenu(0);
ASSERT(pPopup != NULL);
CPoint Point;
GetCursorPos( &Point );
SetForegroundWindow();
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, Point.x, Point.y, this);
}
}
break;
default:break;
}
return 0;
}
上面這段代碼中,添加了鼠標單擊的消息,雙擊和其他消息其實(shí)是一樣的。
最后,在退出的時(shí)候記得要調用
Shell_NotifyIcon(NIM_DELETE, &m_NotifyID);
來(lái)把托盤(pán)圖標刪除。
當然還有做動(dòng)畫(huà)托盤(pán),就是托盤(pán)上的圖標是變化的,這個(gè)可以在上面的dlg類(lèi)中添加Timer函數,定時(shí)更換圖標就可以了。
聯(lián)系客服