1. 程式人生 > >VC++MFC對話方塊應用程式實現程式最小化到系統托盤

VC++MFC對話方塊應用程式實現程式最小化到系統托盤

轉自: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);刪除托盤圖示.

 在此附上原始碼工程:點我下載