Windows 95以及后來的Windows版本允許你將程序圖標(biāo)放入系統(tǒng)托盤。所謂系統(tǒng)托盤,通常指的是屏幕右下方顯示時(shí)間,音量等圖標(biāo)的那個(gè)區(qū)域。這個(gè)區(qū)域主要用于顯示狀態(tài)信息或者當(dāng)你運(yùn)行的程序不可見時(shí),允許你方便地訪問程序的主要特性。這個(gè)區(qū)域還可以用于顯示小程序的圖標(biāo),以便用戶容易訪問主程序,或者在預(yù)定的時(shí)間加載主程序。有些系統(tǒng)托盤圖標(biāo)可以變化用以指示程序狀態(tài),例如,瀏覽器的系統(tǒng)托盤圖標(biāo)當(dāng)modem接收和發(fā)送數(shù)據(jù)時(shí)顯示的是不同的圖標(biāo)。把鼠標(biāo)移到托盤圖標(biāo)上停留一下常常會(huì)顯示一個(gè)提示,根據(jù)程序的狀態(tài),它可能也會(huì)變化。在托盤圖標(biāo)上單擊鼠標(biāo)右鍵常常顯示一個(gè)程序菜單,而雙擊鼠標(biāo)左鍵常??梢詥?dòng)主窗口或應(yīng)用程序。訪問系統(tǒng)托盤的方法是通過Shell_NotifyIcon函數(shù)和NOTIFYICONDATA結(jié)構(gòu)實(shí)現(xiàn)的。 typedef struct _NOTIFYICONDATA { DWORD cbSize; HWND hWnd; UINT uID; UINT uFlags; UINT uCallbackMessage; HICON hIcon; TCHAR szTip[64]; DWORD dwState; //Version 5.0 DWORD dwStateMask; //Version 5.0 TCHAR szInfo[256]; //Version 5.0 UINT uTimeout; //Version 5.0 TCHAR szInfoTitle[64]; //Version 5.0 DWORD dwInfoFlags; //Version 5.0 } NOTIFYICONDATA, *PNOTIFYICONDATA; 為了要在系統(tǒng)托盤中顯示圖標(biāo),用NIM_ADD標(biāo)志調(diào)用Shell_NotifyIcon函數(shù)。 #define ID_TASKBARICON 100 #define WM_ICONNOTIFY (WM_USER + 101) NOTIFYICONDATA nid; // 初始化系統(tǒng)托盤圖標(biāo) nid.cbSize = sizeof(NOTIFYICONDATA); nid.hWnd = hWnd; nid.uID = ID_TASKBARICON; nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; nid.uCallbackMessage = WM_ICONNOTIFY; nid.hIcon = LoadImage(hInst, MAKEINTRESOURCE(IDI_TRAY1), IMAGE_ICON, 16, 16, 0); strcpy(nid.szTip, "My Tooltip Text"); Shell_NotifyIcon(NIM_ADD, &nid); cbSize成員是結(jié)構(gòu)的大?。ㄊ褂盟饕菫榱酥С謱磉@個(gè)結(jié)構(gòu)大小增加)。 hWnd是窗口句柄。當(dāng)圖標(biāo)發(fā)生某事件時(shí)(如單擊、雙擊等),Windows將向窗口發(fā)送uCallbackMessage成員指定的消息。uID成員指定與圖標(biāo)關(guān)聯(lián)的ID。它不是很重要,除非你需要顯示并跟蹤幾個(gè)圖標(biāo)。 uFlag成員告訴Windows應(yīng)該讀取哪個(gè)成員。當(dāng)添加一個(gè)圖標(biāo)時(shí),應(yīng)該包含這個(gè)結(jié)構(gòu)的大多數(shù)成員。當(dāng)更新圖標(biāo)時(shí),如只是需要改變圖標(biāo)時(shí),你只要設(shè)置相應(yīng) 的標(biāo)志就可以了。 hIcon成員是你想顯示的圖標(biāo)。 最后,szTip成員是提示文本。設(shè)置好這些結(jié)構(gòu)成員后,調(diào)用Shell_NotifyIcon函數(shù)。 當(dāng)與圖標(biāo)關(guān)聯(lián)的事件發(fā)生時(shí),Windows將發(fā)送uCallbackMessage成員指定的消息。IParam包含發(fā)送的消息。當(dāng)獲得WM_LBUTTONDBLCLK消息時(shí)顯示主窗口 或者啟動(dòng)主程序。當(dāng)獲得WM_RBUTTONUP消息時(shí)顯示菜單。 注意:如果在系統(tǒng)托盤中單擊鼠標(biāo)右鍵,有時(shí)會(huì)有一個(gè)彈出式(上下文菜單)菜單顯示/消失的怪現(xiàn)象,詳細(xì)信息擊解決辦法請(qǐng)參閱微軟知識(shí)庫(kù)文章Q135788,也可以參考下列代碼加以解決。 switch(nMsg) { case WM_ICONNOTIFY: switch(lParam) { case WM_LBUTTONDBLCLK: // Load main window here break; case WM_RBUTTONUP: { POINT point; HMENU hMenu, hSubMenu; // Get mouse position GetCursorPos(&point); // Popup context menu hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_MYMENU)); hSubMenu = GetSubMenu(hMenu, 0); SetMenuDefaultItem(hSubMenu, IDM_DEFAULTCMD, FALSE); SetForegroundWindow(hMainDlg); // Per KB Article Q135788 TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON|TPM_RIGHTBUTTON|TPM_LEFTALIGN, point.x, point.y, 0, hWnd, NULL); PostMessage(hMainDlg, WM_NULL, 0, 0); // Per KB Article Q135788 DestroyMenu(hMenu); } break; default: return FALSE; } } 不論什么時(shí)候,你都可以用 NIM_MODIFY 調(diào)用 Shell_NotifyIcon。程序終止之前,用 NIM_DELETE 調(diào)用 Shell_NotifyIcon從托盤中清除圖標(biāo)。 Shell_NotifyIcon(NIM_DELETE, &nid);
|