天天看點

win32進階之路:程式托盤圖示+右鍵彈出菜單

   開場白

    本次介紹兩個非常棒且實用的技巧:程式托盤圖示和右鍵彈出菜單,效果如下圖。

win32進階之路:程式托盤圖示+右鍵彈出菜單

    程式托盤圖示用了迅雷的圖示,右鍵點選時候會彈出三個選項的菜單。

    程式托盤圖示設定

    我會用盡可能清晰明了的步驟介紹方式來講述,我假設大家已經動手寫了屬于自己的windows窗體,剛學習win32的朋友可以看一下我之前的部落格,有介紹如何從頭建立屬于自己的第一個windows視窗,也可以直接參照本文末尾貼出的完整代碼做一些參考。如果大家覺得其他方式更好或者對講述不了解的可以評論或者發送給我的郵箱[email protected],QQ382128698. 

        步驟1:聲明托盤圖示對象并給關鍵成員指派。

        步驟2:通知windows在右下角區域添加圖示。

        步驟3:處理托盤圖示的左鍵點選和右鍵點選消息。

        步驟1/2的代碼: 

        void NotifySwitch(HWND hWND,TCHAR operation[4])

{

if(!strncmp(operation, TEXT("MIN"), 3))

{

                //聲明變量并初始化

NOTIFYICONDATA nID = {};

                //關聯的托盤圖示資源,圖示需要是16*16或者32*32像素的                                                       

nID.hIcon = (HICON)LoadImage(NULL, TEXT("notify.ico"), IMAGE_ICON, 0, 0, LR_LOADFROMFILE);     

//托盤圖示的提示語,即滑鼠放在上面會彈出的提示

                strncpy_s(nID.szTip, TEXT("自制鎖屏軟體賣萌中"), sizeof(TEXT("自制鎖屏軟體賣萌中")));          

//托盤圖示關聯的視窗

                nID.hWnd = hWND;                                                                               

//應用程式隻有一個托盤圖示的話可以随便設

                nID.uID = 1;                                                                                     

//托盤圖示的類型,詳解見MSDN 

                nID.uFlags = NIF_GUID | NIF_ICON | NIF_MESSAGE | NIF_TIP;                                         

//托盤圖示關聯的消息ID,托盤的左擊和右擊消息的消息ID就是它

                nID.uCallbackMessage = WM_MINMAXNotify;                                                            

//通知windows添加一個托盤圖示,看參數就知道啦

                Shell_NotifyIcon(NIM_ADD, &nID);                                                               

}

        步驟3的代碼,即如何處理托盤關聯的消息。

        再次假設大家已經有了自己的windows窗體,完整代碼參考本文最後貼出的代碼。    

case WM_MINMAXNotify:

switch(lparam)

case WM_LBUTTONDOWN:

MessageBox(NULL, TEXT("Recv notify icon message"), TEXT("notify"), MB_ICONHAND);

break;

case WM_RBUTTONDOWN:

POINT pt;

GetCursorPos(&pt);

HMENU hMenu;

hMenu = CreatePopupMenu();

AppendMenu(hMenu, MF_STRING , IDM_FIR, "秘籍");

AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);

AppendMenu(hMenu, MF_STRING, IDM_SEC, TEXT("打怪"));

AppendMenu(hMenu, MF_STRING, IDM_THI, TEXT("補給"));

TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, NULL, hwnd, NULL);

break;

  是不是太簡單了!呵呵,就這麼簡單,在windows的窗體處理函數中增加一個case處理托盤關聯的消息,滑鼠對托盤的動作可以通過lparam參數來擷取,這裡我處理了左鍵和右鍵的單擊消息,左鍵單擊彈出一個提示框,右鍵單擊托盤......好嘛,我已經漏題了,沒錯,右鍵的處理就是添加一個彈出菜單。

    增加右鍵彈出菜單 

步驟1:建立一個PopMenu對象。

        步驟2:為新增加的彈出菜單增加菜單項。

    步驟3:顯示新增加的菜單。

步驟4:處理菜單項的消息。 

又用4步就搞定了這麼實用的技巧,是不是小激動呢?盡管前面已經漏題了,還是講一下代碼吧。

         建立一個彈出菜單的HMENU句柄,菜單分很多種,需要用對應的建立API

HMENU hMenu = CreatePopupMenu();

   插入一個菜單項,并給菜單項起一個字元名稱,這裡必須設定菜單項的類型是MF_STRING,并給菜單項關聯一個ID

AppendMenu(hMenu, MF_STRING , IDM_FIR, "秘籍");

插入一個分隔符,讓菜單更好看,啥?沒錯,就是更好看一點

 AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);

win32進階之路:程式托盤圖示+右鍵彈出菜單

對比一下前面的截圖,不一樣的地方就是分隔符在搞鬼了。

擷取到目前的滑鼠位置并顯示剛建立的彈出菜單,這裡有一個小技巧,為什麼不把彈出菜單和目前視窗關聯起來呢,這樣點選菜單後就會自動銷毀菜單了。 

POINT pt;

GetCursorPos(&pt);  

TrackPopupMenu(hMenu, TPM_RIGHTBUTTON, pt.x, pt.y, NULL, hwnd, NULL);

彈出菜單的響應消息屬于WM_COMMAND指令系列,通過wparam可以區分點選的菜單項。

case WM_COMMAND:

switch (wparam)

case IDM_FIR:

MessageBox(NULL, TEXT("Recv popup menu idm_fir message"), TEXT("Popup"), MB_ICONINFORMATION);

case IDM_SEC:

MessageBox(NULL, TEXT("Recv popup menu idm_sec message"), TEXT("Popup"), MB_ICONASTERISK);

break;

case IDM_THI:

MessageBox(NULL, TEXT("Recv popup menu idm_thi message"), TEXT("Popup"), MB_ICONEXCLAMATION);

default:

  源代碼連結說明:完整代碼是還在完善中的一個鎖屏軟體代碼,可能要費些功夫去尋找一下本文介紹的功能,當然也可能會對大家有一些額外的幫助,下面是鎖屏軟體的截圖,中間的妹子可是會眨眼賣萌的喲,子視窗會逐漸漂移,碰到螢幕邊緣會反彈回來。

win32進階之路:程式托盤圖示+右鍵彈出菜單

鎖屏軟體持續更新中,歡迎大家關注我的部落格。

代碼及示例 http://download.csdn.net/detail/hd770c/6920757