添加一個托盤圖標是很有必要的,如果要實現程序的隱藏和喚醒的話。令一方面添加了托盤圖標的程序比較方便用戶進行退出等操作,而且有時候我們可以添加一些信息,讓用戶移動到圖標上時候顯示。最後還可以搞個簡單點的動畫方案,如qq登陸時候左看看右看看。要實現這些我們先看一個結構:NOTIFYICONDATA官方定義爲
NOTIFYICONDATA 結構體說明
包含系統需要的用來傳遞托盤區域消息的信息。
typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
TCHAR szTip[64];
DWORD dwState;
DWORD dwStateMask;
TCHAR szInfo[256];
union {
UINT uTimeout;
UINT uVersion;
};
TCHAR szInfoTitle[64];
DWORD dwInfoFlags;
GUID guidItem;
} NOTIFYICONDATA, *PNOTIFYICONDATA;
cbSize
結構體的大小,以字節爲單位。
hWnd
窗口的句柄。標示的窗口用來接收與托盤圖標相關的消息。Shell_NotifyIcon函數調用時,hWnd和uID成員用來標示具體要操作的圖標。
uID
應用程序定義的任務欄圖標的標識符。Shell_NotifyIcon函數調用時,hWnd和uID成員用來標示具體要操作的圖標。通過將多次調用,你可以使用不同的uID將多個圖標關聯到一個窗口hWnd。
uFlags
此成員表明具體哪些其他成員爲合法數據(即哪些成員起作用)。此成員可以爲以下值的組合:
NIF_ICON
hIcon成員起作用。
NIF_MESSAGE
uCallbackMessage成員起作用。
NIF_TIP
szTip成員起作用。
NIF_STATE
dwState和dwStateMask成員起作用。
NIF_INFO
使用氣球提示代替普通的工具提示框。szInfo, uTimeout, szInfoTitle和dwInfoFlags成員起作用。
NIF_GUID
保留。
uCallbackMessage
應用程序定義的消息標示。當托盤圖標區域發生鼠標事件或者使用鍵盤選擇或激活圖標時,系統將使用此標示向由hWnd成員標示的窗口發送消息。消息響應函數的wParam參數標示了消息事件發生的任務欄圖標,lParam參數根據事件的不同,包含了鼠標或鍵盤的具體消息,例如當鼠標指針移過托盤圖標時,lParam將爲WM_MOUSEMOVE。
hIcon
增加、修改或刪除的圖標的句柄。注意,windows不同版本對於圖標有不同要求。Windows XP可支持32位。
szTip
指向一個以\0結束的字符串的指針。字符串的內容爲標準工具提示的信息。包含最後的\0字符,szTip最多含有64個字符。
對於Version 5.0 和以後版本,szTip最多含有128個字符(包含最後的\0字符)。
dwState
Version 5.0,圖標的狀態,有兩個可選值,如下:
NIS_HIDDEN
圖標隱藏
NIS_SHAREDICON
圖標共享
dwStateMask
Version 5.0. 指明dwState成員的那些位可以被設置或者訪問。比如設置此成員爲NIS_HIDDEN,將導致只有hidden狀態可以被獲取。
szInfo
Version 5.0. 指向一個以\0結束的字符串的指針。字符串的內容爲氣球提示內容。最多含有255個字符。如果要移除已經存在的氣球提示信息,設置uFlags成員爲NIF_INFO,同時將szInfo設爲空。
uTimeout
和uVersion成員爲聯合體。uTimeout表示氣球提示超時的時間,單位爲毫秒,此時間後氣球提示將消失。系統默認氣球提示的超時時間最小值爲10秒,最大值爲30秒。如果設置的uTimeout的值小於10將設置最小值,如果大於30將設置最大值。將超時時間分爲最大最小兩種,是因爲解決不同圖標的氣球提示同時彈出的問題,詳細內容請參考MSDN中NOTIFYICONDATA結構體說明的remarks。
uVersion
Version 5.0. 和uTimeout成員爲聯合體。用來設置使用Windows 95 還是 Windows 2000風格的圖標消息接口。請參考Shell_NotifyIcon函數的說明獲取更多信息。只有當使用Shell_NotifyIcon函數發送NIM_SETVERSION消息時,此成員纔有作用。可選的值如下:
0
使用Windows 95風格。針對Windows 2000版本之前的windows設計的軟件請使用此值。
NOTIFYICON_VERSION
使用Windows 2000風格。 針對Windows 2000版本以及以後版本的windows設計的軟件請使用此值。
szInfoTitle
Version 5.0. 指向一個以\0結束的字符串的指針。字符串的內容爲氣球提示的標題。此標題出現在氣球提示框的上部,最多含有63個字符。
dwInfoFlags
Version 5.0. 設置此成員用來給氣球提示框增加一個圖標。增加的圖標出現在氣球提示標題的左側,注意如果szInfoTitle成員設爲空字符串,則圖標也不會顯示。可選值如下:
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. 禁止播放相應聲音。
guidItem
Version 6.0. 保留。
看着頭暈,還是從我的一個程序中的實例入手
先在xxDlg.h中定義結構
NOTIFYICONDATA tnd;
我們一般定義爲整個類都能用到的,這樣子就可以在改動時候只改動某個參數就ok了。
在BOOL CGangwangDlg::OnInitDialog()中開始使用:
tnd.cbSize=sizeof(NOTIFYICONDATA); //結構體得大小
tnd.hWnd=this->m_hWnd; //句柄,我們用窗口句柄就ok了
tnd.uID=IDR_MAINFRAME;
tnd.uFlags=NIF_MESSAGE |NIF_ICON |NIF_TIP; //支持消息,圖標,還有鼠標移動上去提示
tnd.uCallbackMessage=WM_LIBEN; //當點擊或者其他操作是發送給程序的消息
tnd.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME); //圖標先載入我們的程序圖標www.chaochaoblog.com
strcpy(tnd.szTip,"吵吵登陸器v3.0"); //提醒的文字
Shell_NotifyIcon(NIM_ADD,&tnd);//都設置完了後添加到托盤中去,記住這個函數哦
我們先看消息映射
在頭文件中定義消息
#define WM_LIBEN (WM_USER + 101)
在該類的proteced中添加消息映射
afx_msg void OnLIBEN(WPARAM wParam, LPARAM lParam);
然後回到cpp中再次關聯消息和函數
ON_MESSAGE(WM_LIBEN, OnLIBEN)
之後就添加消息響應函數了
void CGangwangDlg::OnLIBEN(WPARAM wParam, LPARAM lParam)
{
if(lParam==WM_RBUTTONDOWN || lParam==WM_RBUTTONUP)//右鍵按下消息
{
CMenu popMenu; //這裏你可以做你自己的事情了,我是彈出一個菜單
popMenu.CreatePopupMenu();
//注意每個 都需要一個消息對應 用oncommand來映射
popMenu.AppendMenu(MF_STRING,IDM_MENU_HIDESHOWWINDOW,strShowHide);
popMenu.AppendMenu(MF_STRING,IDM_MENU_CHANGEBACK,"更換皮膚");
popMenu.AppendMenu(MF_STRING,IDM_MENU_EXITUSER,"退出賬號");
popMenu.AppendMenu(MF_STRING,IDM_MENU_EXIT, "退出");
SetForegroundWindow();
CPoint point;
GetCursorPos(&point);
::TrackPopupMenu(popMenu.m_hMenu,TPM_LEFTALIGN,point.x,point.y,0,::AfxGetApp()->GetMainWnd()->m_hWnd,NULL);
popMenu.DestroyMenu();
}
}
搞完了消息映射我們再看看動畫怎麼做。
其實也很簡單,搞幾個ico先加載到資源裏面去,然後用一個time去更換圖標就好了
看看我的代碼
void CGangwangDlg::ChangeIcon()
{
if(nIconID==IDI_ICON1)
{
nIconID=IDI_ICON2;
}
else if(nIconID==IDI_ICON2)
{
nIconID=IDI_ICON4;
}
else if(nIconID==IDI_ICON3)
{
nIconID=IDI_ICON1;
}
else
{
nIconID=IDI_ICON3;
}
tnd.hIcon=tnd.hIcon=AfxGetApp()->LoadIcon(nIconID);
Shell_NotifyIcon(NIM_MODIFY,&tnd);//將tnd結構更改應用到托盤中去
}
我這個只用到了三個ico然後在timer消息中調用就好了!
原文鏈接:http://www.chaochaoblog.com/archives/335