原始碼:http://download.csdn.net/detail/nuptboyzhb/4137784
1. 匯入一個托盤表徵圖的資源(.ico)格式;資源ID為IDI_ICON1
2. 在架構程式的初始化函數中,初始化一個托盤表徵圖的一個結構體
NOTIFYICONDATA
notifyicondata;//NOTIFYICONDATA結構
notifyicondata.cbSize = sizeof(NOTIFYICONDATA);//為notifyicondata結構體分配空間
//為notifyicondata結構體各個參數賦值
notifyicondata.hWnd = m_hWnd;//視窗的控制代碼
notifyicondata.uID = IDI_NOTIFYICON; //ID標識
notifyicondata.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
notifyicondata.uCallbackMessage = WM_ADDTRAYICON;//回調訊息的標識;我們要為回調訊息的標識添加使用者訊息映射
notifyicondata.hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);//載入托盤表徵圖
wcscpy(notifyicondata.szTip,
_T("為程式建立托盤表徵圖"));
Shell_NotifyIcon(NIM_ADD, ¬ifyicondata); //裝載托盤表徵圖
注意:在該步驟中有幾個注意的變數:
a. m_hWnd是整個應用程式視窗的控制代碼
b. IDI_NOTIFYICON是我們自己定義的一個常量;即在標頭檔上添加如下代碼:
#define IDI_NOTIFYICON 100 //托盤表徵圖標識
c. WM_ADDTRAYICON是我們自訂訊息的標識,也是一個常量;
#define WM_ADDTRAYICON WM_USER+101//自訂訊息
3. 添加使用者訊息映射和訊息處理函數
1. 新增成員函數:
afx_msg LRESULT OnAddTrayIcon(WPARAM wParam,LPARAM lParam);
2. 添加訊息映射
ON_MESSAGE(WM_ADDTRAYICON, OnAddTrayIcon)//添加訊息映射
注意:第一個參數是使用者自訂訊息的標識;第二個參數是訊息響應處理函數
3. 實現訊息響應處理函數OnAddTrayIcon
LRESULT 類名::OnAddTrayIcon(WPARAM wParam,LPARAM lParam)
{
if (wParam == IDI_NOTIFYICON)//為建立的托盤表徵圖
{
switch(lParam)//訊息的類型
{
case WM_LBUTTONDBLCLK://雙擊左鍵
//實習視窗的隱藏或顯示
//AfxGetApp()->m_pMainWnd->ShowWindow(SW_HIDE);//隱藏視窗
break;
case WM_RBUTTONDBLCLK://雙擊右鍵
{
AfxGetApp()->m_pMainWnd->DestroyWindow();//關閉視窗
break;
}
case WM_RBUTTONDOWN://右擊托盤,顯示菜單
{
CMenu menu,*pSubMenu; //後面要用的CMenu對象
CPoint point;
menu.LoadMenu(IDR_POPUP_MENU); //裝載自訂的右鍵菜單
pSubMenu = menu.GetSubMenu(0); //擷取第一個快顯功能表
GetCursorPos(&point); //擷取當前游標位置 pSubMenu->TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);
break;
}
}
}
return 1;
}
4. 卸載托盤。
當應用程式退出時,卸載
NOTIFYICONDATA
notifyicondata;
notifyicondata.cbSize = sizeof(NOTIFYICONDATA);
notifyicondata.uFlags = 0;
notifyicondata.hWnd = m_hWnd;
notifyicondata.uID
= IDI_NOTIFYICON;
Shell_NotifyIcon(NIM_DELETE, ¬ifyicondata);//卸載托盤表徵圖
NOTIFYICONDATA結構體的uCallbackMessage變數,使得使用者訊息響應與托盤的點擊等訊息關聯在一起;托盤的標識IDI_NOTIFYICON,恰好是使用者訊息響應用來判斷是否是托盤傳遞的訊息的依據;
在基於多文檔或單文檔的應用程式,當使用者點擊最小化按鈕時,我們可以講介面隱藏;
具體是,添加OnSize()訊息
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType,
cx,
cy);
if(nType == SIZE_MINIMIZED)
{
ShowWindow(SW_HIDE); // 當最小化時,隱藏主視窗
}
// TODO: 在此處添加訊息處理常式代碼
}
對話方塊的最小化托盤於此很類似,可以參考:http://justtotry.blog.163.com/blog/static/446308122011622101427208/