MFC最小化到系统托盘
在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最小化到系統托盤的函數中添加如下代碼:
void MinDialog()
{
NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
NotifyIcon.hWnd=m_hWnd;
lstrcpy(NotifyIcon.szTip,_T("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)一句,是清除托盤圖標,在這里可以沒有,但在退出整個程序的時候一定要加上,不然程序退出了,托盤處還有一個圖標,只有鼠標指到那里時系統才會發現是進程殘留而清除,這種做法很不好!
轉載于:https://www.cnblogs.com/flonlen/archive/2011/09/12/2174259.html
總結
以上是生活随笔為你收集整理的MFC最小化到系统托盘的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP 错误 404.13 - Not
- 下一篇: 求一个关于赵丽颖的qq网名