MFC最小化到系統托盤
--《VC編程知識總結》之一
在VC++中,想實現將MFC最小化到系統托盤,需要調用NOTIFYICONDATA類,並註冊相應的消息,以下詳細講解如何實現:
第一步,聲明一個NOTIFYICONDATA類,也就是NOTIFYICONDATA NotifyIcon;該句可以放在Dlg類的聲明中,作爲Dlg類的一個成員;也可以放在Dlg類的實現中,作爲全局變量來使用。
第二步,聲明一個響應函數afx_msg void OnNotifyIcon(WPARAM wParam,LPARAM IParam);用於響應鼠標操作。將這個函數放入Dlg類的聲明中,作爲Dlg類的一個成員。
第三步,定義消息名稱以消息號,並註冊消息,該步很重要!我就是因爲沒有註冊消息,導致調試了很久都找不到問題所在。該步都是在Dlg.cpp(Dlg的實現中)中操作。定義消息名稱和消息號:#define WM_NC (WM_USER+1001),1001只是用於指定一個消息號,可以隨便指定。註冊則是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之間添加ON_MESSAGE(WM_NC,OnNotifyIcon)。
第四步,在要將MFC最小化到系統托盤的函數中添加如下代碼:
NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
NotifyIcon.hWnd=m_hWnd;
lstrcpy(NotifyIcon.szTip,"NotifyIcon Test");
NotifyIcon.uCallbackMessage=WM_NC;
NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&NotifyIcon);
有了上面的代碼,當程序運行到含有如上代碼的函數時就會在系統托盤處添加一個圖標,想隱藏主對話框,就再添加一句ShowWindow(SW_HIDE);這樣就實現了將MFC最小化到系統托盤。但還要添加點擊托盤圖標時響應鼠標的函數,也就是第二步中的函數OnNotifyIcon。
第五步,OnNotifyIcon函數,如下:
void CDlg::OnNotifyIcon(WPARAM wParam,LPARAM IParam)
{
if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
{
ModifyStyleEx(0,WS_EX_TOPMOST);
ShowWindow(SW_SHOW);
//Shell_NotifyIcon(NIM_DELETE, &NotifyIcon);
}
}
以上函數寫的很簡單,因爲我定義的是基於對話框的MFC,沒有添加menu,所以只是實現了簡單的點擊托盤圖標就彈出主對話框。對於右鍵點擊托盤圖標彈出小menu,然後選擇操作,最好是建立工程的時候就選擇基於菜單的MFC,這樣會容易很多,詳細的我自己還沒有研究,就不亂講了。對於上面函數中 Shell_NotifyIcon(NIM_DELETE,&NotifyIcon)一句,是清除托盤圖標,在這裏可以沒有,但在退出整個程序的時候一定要加上,不然程序退出了,托盤處還有一個圖標,只有鼠標指到那裏時系統纔會發現是進程殘留而清除,這種做法很不好!