原文位址:http://blog.sina.com.cn/s/blog_55f9aac501008gql.html
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)一句,是清除托盤圖示,在這裡可以沒有,但在退出整個程式的時候一定要加上,不然程式退出了,托盤處還有一個圖示,隻有滑鼠指到那裡時系統才會發現是程序殘留而清除,這種做法很不好!