自己動手寫類似酷狗播放器(4)_系統托盤的顯示

YunShell發表於2013-08-11
	任何一個應用程式,在開啟後都會在工作列的又下角顯示一個圖示,用來表示這個應用程式已經開啟,比如QQ.那是如何做到 的呢?其實也是很簡單,就是填充NOTIFYICONDATA結構體,這時候就需要對該結構體有個瞭解了,查詢MSDN手冊如下:

步驟:

1.填充NOTIFYICONDATA結構體

訊息處理:當系統托盤圖示發生滑鼠事件時候,會給windows傳送一個ucallbackmessage事件,去到指定視窗函式中響應。

         wParam:這時指的是 UID欄位的值

lparam : 此時附帶的滑鼠動作 比如滑鼠左鍵按下,右鍵按下,雙擊等等。比如,當滑鼠在托盤圖示移動的時候,lParam引數就傳送WM_MOUSEMOVE事件。

2呼叫shell_notifyIcon 函式來增加或者刪除圖示

BOOL Shell_NotifyIcon(
    DWORD dwMessage,     //引數1:訊息的種類 NIM_ADD/DELETE/MOTIFY 圖示的新增,刪除和更改
    PNOTIFYICONDATA pnid //引數2: NOTIFYICONdata結構體的指標
);
	以上兩個步驟就可以顯示一個系統托盤,但是這是沒用的,因為並不會響應任何操作,所以我們接下來要做的就是加入訊息處理

3.新增觸發事件

	目的:當點選系統圖示左鍵顯示主對話方塊,右鍵彈出選單項
當滑鼠在托盤區域發生動作時候,就會產生NOTIFYICONDATA第五個引數的事件,我們這裡是用自定義的事件
#define WM_TRAYMSG WM_USER+1   //自定義事件
也就是說當托盤區域的滑鼠動作時,觸發該事件,在這個事件下,來處理左鍵和右鍵。
	case WM_TRAYMSG: //響應自定義托盤事件
			{	
				if(wParam==1)  //先判斷是否是在圖示區域發生  1就是NOTIFYICONDATA 中UID 的數值
				{	
					switch(lParam)
						{
							case WM_LBUTTONDOWN: //滑鼠左鍵按下 顯示主介面
								{	
									ShowWindow(hDlg_main,SW_SHOWNORMAL);//正常顯示主介面
								//	SetForegroundWindow(hDlg_main);
									 return 0;
								}
							case WM_RBUTTONDOWN: //右鍵載入選單項
								{	
									POINT point;
									GetCursorPos(&point); //獲取滑鼠點選的位置
									HMENU hpopupmenu=CreatePopupMenu();  //建立彈出選單
									HMENU hmenu_playmode=GetSubMenu(GetSubMenu(hmenu,0),2); //獲取控制條目子選單控制程式碼
									AppendMenu(hpopupmenu,MF_STRING,IDM_PAUSEORSTART,TEXT("暫停/繼續"));
									AppendMenu(hpopupmenu,MF_SEPARATOR,NULL,NULL); //新增下劃線
									AppendMenu(hpopupmenu,MF_POPUP,(UINT)hmenu_playmode,TEXT("播放模式"));
									AppendMenu(hpopupmenu,MF_SEPARATOR,NULL,NULL); //新增下劃線
									AppendMenu(hpopupmenu,MF_STRING,IDM_QUIT,TEXT("退出"));
									SetForegroundWindow(hDlg_main);//必須要設定所在的視窗為前臺 
									TrackPopupMenu(hpopupmenu,TPM_RIGHTBUTTON,point.x,point.y,0,hDlg_main,NULL); //顯示選單項
									return 0;
								}
						}
				}
				break;
			
			}
	注意在上面的右鍵操作中處理,在選單彈出前,必須將該選單所在的視窗設定為前臺視窗,不然這個選單隻能顯示,當點選任意其他地方都是消失的。









相關文章