在書上看到的,覺得有用,記下了。
首先,最小化托盤的基本原理是,將應用程序的主窗體隱藏,然後在托盤中繪制應用程序的圖標。然後再為托盤圖標添加一些事件處理。
核心函數是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接收鼠標的行為。
另外,當程序全部關閉時,也應該刪除掉托盤,代碼差不多,不重復了。