最小化托盤的實現方法
在書上看到的,認為實用,記下了。
首先,最小化托盤的基本原理是,將應用程序的主窗口隱藏,然後在托盤中繪制應用程序的圖標。然後再為托盤圖標加入一些事件處理。
核心函數是Shell_NotifyIcon()函數,負責向系統傳遞消息,加入、改動或刪除托盤區的圖標。原型:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage,
PNOTIFYCONDATA pnid
);
當中dwMessage標示功能,有NIM_ADD/NIM_DELETE/NIM_MODIFY。
pnid是程序最小化到托盤的圖標信息結構體:
typedef struct _NOTIFYCONDATA {
DOWRD cbSize; //結構的長度
HWND hWnd;
UINT uID; //圖標ID
UINT uFlags; //標誌著其它哪些成員數據的有效性?
UINT uCallbackMessage; //當用戶單擊托盤區圖標時會向窗體發送消息
HICON hIcon; //圖標句柄
char szTip[64]; //鼠標移動到托盤圖標上時顯示的文字
} NOTIFYICONDATA, *PNOTIFYICONDATA;
相關代碼:
...
NOTIFYICONDATA nid;
nid.cbSize = (DWORD) sizeof (NOTIFYICONDATA);
nid.hWnd = this->m_hWnd;
nid.uID = IDR_MAINFRAME;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP; //這句我不理解?
nid.uCallbackMessage = WM_CALL;
nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
strcpy(nid.szTip,"MyApp");
Shell_NotifyIcon(NIM_ADD,&nid);
ShowWindow(SW_HIDE); //隱藏主窗體
...
接著自己定義消息WM_CALL,方法有一篇文章有講到。
這裏要註意規定了回調消息wParam接收圖標ID。lParam接收鼠標的行為。
另外,當程序所有關閉時,也應該刪除掉托盤。代碼差點兒相同,不反復了。
最小化托盤的實現方法