vc添加任務欄托盤圖標

添加一個托盤圖標是很有必要的,如果要實現程序的隱藏和喚醒的話。
令一方面添加了托盤圖標的程序比較方便用戶進行退出等操作,而且有時候我們可以添加一些信息,讓用戶移動到圖標上時候顯示。最後還可以搞個簡單點的動畫方案,如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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章