Windows 95以及后來(lái)的Windows版本允許你將程序圖標放入系統托盤(pán)。所謂系統托盤(pán),通常指的是屏幕右下方顯示時(shí)間,音量等圖標的那個(gè)區域。這個(gè)區域主要用于顯示狀態(tài)信息或者當你運行的程序不可見(jiàn)時(shí),允許你方便地訪(fǎng)問(wèn)程序的主要特性。這個(gè)區域還可以用于顯示小程序的圖標,以便用戶(hù)容易訪(fǎng)問(wèn)主程序,或者在預定的時(shí)間加載主程序。有些系統托盤(pán)圖標可以變化用以指示程序狀態(tài),例如,瀏覽器的系統托盤(pán)圖標當modem接收和發(fā)送數據時(shí)顯示的是不同的圖標。把鼠標移到托盤(pán)圖標上停留一下常常會(huì )顯示一個(gè)提示,根據程序的狀態(tài),它可能也會(huì )變化。在托盤(pán)圖標上單擊鼠標右鍵常常顯示一個(gè)程序菜單,而雙擊鼠標左鍵常??梢詥?dòng)主窗口或應用程序。訪(fǎng)問(wèn)系統托盤(pán)的方法是通過(guò)Shell_NotifyIcon函數和NOTIFYICONDATA結構實(shí)現的。 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; 為了要在系統托盤(pán)中顯示圖標,用NIM_ADD標志調用Shell_NotifyIcon函數。 #define ID_TASKBARICON 100 #define WM_ICONNOTIFY (WM_USER + 101) NOTIFYICONDATA nid; // 初始化系統托盤(pán)圖標 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成員是結構的大?。ㄊ褂盟饕菫榱酥С謱?lái)這個(gè)結構大小增加)。 hWnd是窗口句柄。當圖標發(fā)生某事件時(shí)(如單擊、雙擊等),Windows將向窗口發(fā)送uCallbackMessage成員指定的消息。uID成員指定與圖標關(guān)聯(lián)的ID。它不是很重要,除非你需要顯示并跟蹤幾個(gè)圖標。 uFlag成員告訴Windows應該讀取哪個(gè)成員。當添加一個(gè)圖標時(shí),應該包含這個(gè)結構的大多數成員。當更新圖標時(shí),如只是需要改變圖標時(shí),你只要設置相應 的標志就可以了。 hIcon成員是你想顯示的圖標。 最后,szTip成員是提示文本。設置好這些結構成員后,調用Shell_NotifyIcon函數。 當與圖標關(guān)聯(lián)的事件發(fā)生時(shí),Windows將發(fā)送uCallbackMessage成員指定的消息。IParam包含發(fā)送的消息。當獲得WM_LBUTTONDBLCLK消息時(shí)顯示主窗口 或者啟動(dòng)主程序。當獲得WM_RBUTTONUP消息時(shí)顯示菜單。 注意:如果在系統托盤(pán)中單擊鼠標右鍵,有時(shí)會(huì )有一個(gè)彈出式(上下文菜單)菜單顯示/消失的怪現象,詳細信息擊解決辦法請參閱微軟知識庫文章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 調用 Shell_NotifyIcon。程序終止之前,用 NIM_DELETE 調用 Shell_NotifyIcon從托盤(pán)中清除圖標。 Shell_NotifyIcon(NIM_DELETE, &nid);
|