1.托盤操作
函數原型: BOOL Shell_NotifyIcon( DWORD dwMessage,PNOTIFYICONDATA lpdata);
返回值
如果圖標操作成功返回TRUE,否則返回FALSE。
如果dwMessage參數設爲NIM_SETVERSION,則如果版本設置成功返回TRUE,如果設置的版本不支持返回FALSE。
參數說明:
>dwMessage爲輸入參數,傳遞發送的消息,表明要執行的操作。可選的值如下:
NIM_ADD
向托盤區域添加一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA結構體中的hWnd和uID成員用來標示這個圖標,以便以後再次使用Shell_NotifyIcon對此圖標操作。
NIM_DELETE
刪除托盤區域的一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA結構體中的hWnd和uID成員用來標示需要被刪除的這個圖標。
NIM_MODIFY
修改托盤區域的一個圖標。此時第二個參數lpdata指向的NOTIFYICONDATA結構體中的hWnd和uID成員用來標示需要被修改的這個圖標。
注意:在修改圖標的時候,只需要修改NOTIFYICONDATA的hIcon就行了。呵呵我們再做閃爍托盤的時候經常用到哦!
NIM_SETFOCUS
Version 5.0. 設置焦點。比如當用戶操作托盤圖標彈出菜單,而有按下ESC鍵將菜單消除後,程序應該使用此消息來將焦點設置到托盤圖標上。
NIM_SETVERSION
Version 5.0. 設置任務欄按照第二個參數lpdata指向的NOTIFYICONDATA結構體中的uVersion成員指定的版本號來工作。此消息可以允許用戶設置是否使用基於Windows2000的version 5.0的風格。uVersion的缺省值爲0,默認指明瞭使用原始Windows 95圖標消息風格。具體這兩者的區別請參考msdn中的Shell_NotifyIcon函數說明的Remarks。
>lpdata爲輸入參數,是指向NOTIFYICONDATA結構體的指針,結構體內容用來配合第一個參數wMessage進行圖標操作
NOTIFYICONDATA 結構體說明:
typedef struct _NOTIFYICONDATA {
DWORD cbSize; //大小
HWND hWnd; //窗口的句柄
UINT uID; //應用程序定義的任務欄圖標的標識符
UINT uFlags; //標誌:此成員表明具體哪些其他成員爲合法數據
UINT uCallbackMessage;//回調消息
HICON hIcon; //增加、修改或刪除的圖標的句柄
TCHAR szTip[64]; //提示信息串(/0)結束
DWORD dwState; //圖標狀態。NIS_HIDDEN(隱藏)/NIS_SHAREDICON (共享)
DWORD dwStateMask;//指明dwState成員的那些位可以被設置或者訪問
TCHAR szInfo[256];//氣球提示內容,刪除該內容:設置uFlags成員爲NIF_INFO,同時將szInfo設爲空
union {
UINT uTimeout;//氣球提示的時間
UINT uVersion;//圖標版本
};
TCHAR szInfoTitle[64];//氣球提示標題
DWORD dwInfoFlags;//氣球提示框增加一個圖標。在氣球提示標題的左側,szInfoTitle成員設爲空字符串,則圖標也不會顯示.
GUID guidItem;//保留成員
} NOTIFYICONDATA, *PNOTIFYICONDATA;
注意:
標誌成員uFlags可取的值:
NIF_ICON hIcon成員起作用。
NIF_MESSAGE uCallbackMessage成員起作用。
NIF_TIP szTip成員起作用。
NIF_STATE dwState和dwStateMask成員起作用。
NIF_INFO 使用氣球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成員起作用。
NIF_GUID 保留。
標誌成員dwInfoFlags可取的值:
NIIF_ERROR 錯誤圖標。
NIIF_INFO 信息圖標。
NIIF_NONE 沒有圖標。
NIIF_USER 使用用戶使用hIcon成員指明的圖標,要求Windows XP Service Pack 2 (SP2)或以後系統。
NIIF_WARNING 警告圖標。
NIIF_ICON_MASK Version 6.0. 保留。
NIIF_NOSOUND Version 6.0. 禁止播放相應聲音。
2.消息處理
剛纔我們看到了,對於托盤的消息我們是可以添加響應消息函數的,如下:
>定義消息ID
#define WM_NOTIFYSHELL WM_USER+100
>定義響應函數
LRESULT OnNotificationPan (WPARAM wParam, LPARAM lParam);
>添加消息映射
ON_MESSAGE(WM_NOTIFYSHELL, OnNotificationPan)
>實現OnNotificationPan
LRESULT CTest::OnNotificationPan(WPARAM wParam, LPARAM lParam)
{
switch ( lParam )
{
case WM_RBUTTONDOWN:
break;
case WM_LBUTTONDBLCLK:
break;
default:
break;
}
return 0;
}
3.實例
m_notifyData.cbSize = sizeof (NOTIFYICONDATA);//m_notifyData是頭文件定義的成員
m_notifyData.hWnd = m_hWnd;
m_notifyData.uID = IDR_MAINFRAME;
m_notifyData.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_notifyData.uCallbackMessage = WM_NOTIFYSHELL;
m_notifyData.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//WTL使用 LoadIcon(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDR_MAINFRAME));
lstrcpy(m_notifyData.szTip, GATEWAY_INFO);
Shell_NotifyIcon(NIM_ADD, &m_notifyData);
托盤其實就是這麼簡單,哈哈,OVER。