在程序最小化時(shí),不在windows的任務(wù)欄中出現(xiàn),而是在右下角的系統(tǒng)托盤中顯示一個(gè)小圖標(biāo),當(dāng)鼠標(biāo)單擊時(shí)顯示功能菜單,雙擊時(shí)打開主界面。這就是系統(tǒng)托盤程序的一般功能,想qq和很多桌面搜索程序都是這么做了,給人的感覺比較清爽,不用的時(shí)候就縮在一個(gè)小角落里,用的時(shí)候也能很快的找到。
在技術(shù)實(shí)現(xiàn)上
首先是創(chuàng)建托盤:
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;//自定義的消息名稱
m_NotifyID.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(m_NotifyID.szTip,"桌面搜索");//信息提示
Shell_NotifyIcon(NIM_ADD,&m_NotifyID);//在托盤區(qū)添加圖標(biāo)
}
上面的代碼就是一個(gè)一般創(chuàng)建的方法,其中定義NOTIFYICONDATA m_NotifyID;
WM_NOTIFYICON是自定義的消息,我們可以用
#define WM_NOTIFYICON WM_USE+5
來定義
調(diào)用InitTray()后會(huì)在托盤上出現(xiàn)一個(gè)小圖標(biāo),當(dāng)然我們也同時(shí)要把任務(wù)欄中的程序任務(wù)去掉,只要調(diào)用ShowWindow(SW_HIDE)就可以了
接下來是創(chuàng)建一個(gè)菜單資源,假設(shè)為IDR_MENU_TP
然后要做的是添加WM_NOTIFYICON消息:
在BEGIN_MESSAGE_MAP(CDiskSearchDlg, CDialog)內(nèi)要添加
ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon)//手工添加托盤消息映射
并定義函數(shù)
LONG CDiskSearchDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
//wParam中是響應(yīng)消息的圖標(biāo)ID,lParam中則是Windows的消息
switch ( lParam )
{
case WM_RBUTTONDOWN:
{// 用戶在托盤圖標(biāo)上單擊鼠標(biāo)右鍵,彈出菜單
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:
{// 用戶在托盤圖標(biāo)上單擊鼠標(biāo)右鍵,彈出菜單
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;
}
上面這段代碼中,添加了鼠標(biāo)單擊的消息,雙擊和其他消息其實(shí)是一樣的。
最后,在退出的時(shí)候記得要調(diào)用
Shell_NotifyIcon(NIM_DELETE, &m_NotifyID);
來把托盤圖標(biāo)刪除。
當(dāng)然還有做動(dòng)畫托盤,就是托盤上的圖標(biāo)是變化的,這個(gè)可以在上面的dlg類中添加Timer函數(shù),定時(shí)更換圖標(biāo)就可以了。
聯(lián)系客服