在VC++中,想實現將MFC最小化到系統托盤,需要調用NOTIFYICONDATA類,並注冊相應的消息,以下詳細講解如何實現:
1。聲明一個NOTIFYICONDATA類,也就是NOTIFYICONDATA NotifyIcon;該句可以放在Dlg類的聲明中,作為Dlg類的一個成員;也可以放在Dlg類的實現中,作為全局變量來使用。
2。聲明一個響應函數afx_msg LRESULT OnClickTray(WPARAM wParam,LPARAM IParam);用於響應鼠標操作。將這個函數放入Dlg類的聲明中,作為Dlg類的一個成員。
3。自定義消息,用於點擊托盤 來響應的消息:
定義消息名稱和消息號:#define WM_CLICK_TRAY (WM_USER+001),1001只是用於指定一個消息號,可以隨便指定。注冊則是在BEGIN_MESSAGE_MAP(Dlg,CDialog)和END_MESSAGE_MAP()之間添加ON_MESSAGE(WM_NC,OnClickTray)。
4。最小化到托盤實現:本例是點擊最小化按鈕將對話框程序最小化到托盤:實現代碼如下:
void CDesktopUtilDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else if(nID ==SC_MINIMIZE )
{
NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
NotifyIcon.hWnd=m_hWnd;
lstrcpy(NotifyIcon.szTip,L"NotifyIcon Test");
NotifyIcon.uCallbackMessage=WM_CLICK_TRAY;
NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&NotifyIcon);
ShowWindow(SW_HIDE);
}
else
{
CDHtmlDialog::OnSysCommand(nID, lParam);
}
}
5。點擊托盤圖標響應事件:afx_msg LRESULT OnClickTray(WPARAM wParam,LPARAM IParam);功能是點擊托盤圖標的時候還原對話框程序,實現代碼如下:
LRESULT CDesktopUtilDlg::OnClickTray(WPARAM wParam,LPARAM IParam)
{
if ((IParam == WM_LBUTTONDOWN) || (IParam == WM_RBUTTONDOWN))
{
ModifyStyleEx(0,WS_EX_TOPMOST);
ShowWindow(SW_SHOW);
}
return 0;
}
