1. 程式人生 > >最小化托盤的實現方法

最小化托盤的實現方法

fyi typedef hand delet odi 功能 content call not

在書上看到的,認為實用,記下了。

首先,最小化托盤的基本原理是,將應用程序的主窗口隱藏,然後在托盤中繪制應用程序的圖標。然後再為托盤圖標加入一些事件處理。

核心函數是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接收鼠標的行為。

另外,當程序所有關閉時,也應該刪除掉托盤。代碼差點兒相同,不反復了。


最小化托盤的實現方法