VC++MFC對話方塊應用程式實現程式最小化到系統托盤
阿新 • • 發佈:2019-02-12
轉自:http://blog.sina.com.cn/s/blog_6b23bc700100pqrm.html
現在使用系統托盤圖示的程式越來越多,尤其是需要長時間執行的程式。這並不是什麼高深的技術,純當做個筆記。
第一步:定義一個 NOTIFYICONDATA 結構變數 nid。NOTIFYICONDATA結構體定義可以在MSDN中查詢,就不做多做介紹。第二步:設定NOTIFYICONDATA變數屬性:
nid.cbSize =sizeof(NOTIFYICONDATA);
nid.hWnd =m_hWnd;
nid.hIcon =m_hIcon;
nid.uFlags = NIF_ICON|NIF_MESSAGE|NIF_TIP|NIF_INFO;
m_nid.uID = IDR_MAINFRAME;//IDR_MAINFRAME是你自己匯入的一個icon資源的ID
m_nid.hIcon = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
nid.uCallbackMessage =WM_NOTIFYICON;//#define WM_NOTIFYICON (WM_USER +101) 自己定義wcscpy(nid.szTip, L"這是標籤");
wcscpy(nid.szInfo, L"這是氣泡提示訊息");
wcscpy(nid.szInfoTitle, L"這是氣泡提示標題");
nid.dwInfoFlags = NIIF_INFO;
nid.uTimeout = 1000;
第三步:將圖示顯示到系統托盤,只需呼叫一個API即可完成.
Shell_NotifyIcon (NIM_ADD,&nid);
第四步:圖示新增完成了,我們通常需要讓它響應使用者的各種操作。如雙擊顯示窗體,右鍵彈出上下文選單等.
首先,我們定義一個回撥函式
LRESULT OnNotifyIcon(WPARAM wParam, LPARAM lParam)
{
switch(lParam)//根據lParam判斷相對應的事件
{
case WM_LBUTTONDBLCLK://如果左鍵雙擊托盤圖示,則顯示窗體
ShowWindow (SW_SHOWNORMAL );
SetForegroundWindow();
break;
case WM_RBUTTONUP://如果右鍵選單彈起,則彈出選單
CPoint pos;
GetCursorPos(&pos);
if(pMenuContext != NULL)
{
SetForegroundWindow();//加這句是為了滑鼠點選其他地方時,彈出的選單能夠消失
pMenuContext->TrackPopupMenu(TPM_RIGHTBUTTON|TPM_RIGHTALIGN,pos.x+1,pos.y+1,this);
}
break;
}
return 0;
}
然後在BEGIN_MESSAGE_MAP 與END_MESSAGE_MAP 之間新增
ON_MESSAGE (WM_NOTIFYICON ,&OnNotifyIcon)
進行訊息對映就完成了
我們已經完成了對程式新增托盤圖示,而且可以通過圖示對應用程式進行一定的操作,但是當程式退出的時候,系統托盤圖示並不會自動刪除,所以我們還需要在 OnClose() 中呼叫::Shell_NotifyIcon (NIM_DELETE ,&nid);刪除托盤圖示.
在此附上原始碼工程:點我下載