通過以下步驟可以在MFC程序中將窗口最小化到系統托盤,和還原成窗口,附加代碼中如有特殊說明則會用紅色標出。
1、添加一個ICON圖標,其ID爲IDI_ICON_TESTICON,在VS2008座標的Resource View(資源視圖)中添加,該圖標主要用於在托盤區顯示;在頭文件中定義添加托盤圖標的消息號(用戶所有對托盤的消息將對應此消息號):
#define WM_ICON_NOTIFY WM_USER +1
2、新添加一個函數_ToTray(void),讓其添加一個托盤圖標:
void CAirMove_mainDlg::_ToTray(void)
{
m_NotifyIcon.cbSize=sizeof(NOTIFYICONDATA);
m_NotifyIcon.hIcon=AfxGetApp()->LoadIcon(IDI_ICON_TESTICON);
m_NotifyIcon.hWnd=m_hWnd;
m_NotifyIcon.uID = IDI_ICON_AIRMOVE;
lstrcpy(m_NotifyIcon.szTip,_T("Test"));
m_NotifyIcon.uCallbackMessage=WM_ICON_NOTIFY;
m_NotifyIcon.uFlags=NIF_ICON | NIF_MESSAGE | NIF_TIP;
Shell_NotifyIcon(NIM_ADD,&m_NotifyIcon);
m_IsWindowHide = true;
}
說明:
(1)需注意其中的消息號WM_ICON_NOTIFY是托盤區的響應消息,即用戶對托盤圖標的所有操作都會發送到此消息對應的響應函數中
(2)成員變量m_IsWindowHide 用於標識窗口是否已經最小化到系統托盤,該變量初始化爲true
(3)向托盤區發送的消息號爲WM_ICON_NOTIFY,
2、在窗口初始化函數OnInitDialog()中調用步驟2中添加的函數_ToTray
// TODO: Add extra initialization here
_ToTray();
3、添加消息WM_ICON_NOTIFY的響應函數_OnIconNotify:
(1)在頭文件中添加響應函數_OnIconNotify的聲明:
afx_msg LRESULT _OnIconNotify(WPARAM wParam,LPARAM lParam);
(2)在cpp文件中的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間添加消息與函數的映射宏:
ON_MESSAGE(WM_ICON_NOTIFY,_OnIconNotify)
(3)在cpp文件中實現消息響應函數_OnIconNotify:
LRESULT CAirMove_mainDlg::_OnIconNotify(WPARAM wParam,LPARAM lParam)
{
UINT uID;
UINT uMouseMsg;
uID = (UINT) wParam;
uMouseMsg = (UINT)lParam;
switch (uMouseMsg)
{
case WM_RBUTTONDOWN:
{
CMenu popMenu;
popMenu.CreatePopupMenu();
popMenu.AppendMenu(MF_STRING, WM_DESTROY, _T("exit"));
popMenu.AppendMenu(MF_STRING, WM_START_DEBUGER, _T("啓動 Debuger窗口")); popMenu.AppendMenu(MF_STRING, WM_HIDE_WORKING_WINDOW, _T("隱藏鎖定窗口")); popMenu.AppendMenu(MF_STRING, WM_DISPLAY_WORKING_WINDOW, _T("打開鎖定窗口"));
POINT ptMouse;
::GetCursorPos(&ptMouse);
::SetForegroundWindow(m_NotifyIcon.hWnd);
::TrackPopupMenu(popMenu.m_hMenu, 0, ptMouse.x, ptMouse.y, 0, m_NotifyIcon.hWnd, NULL);
break;
}
case WM_LBUTTONDBLCLK:
{
_OnStartDebuger(0,0);
break;
}
}
return 0;
}
說明:
(1)上述消息響應函數的實現只是個例子,在開發過程中可以根據自己的需要添加特定的功能。
(2)上述的消息響應函數中只實現了對托盤的鼠標左鍵雙擊和右鍵的響應。其中右鍵響應消息中實現一個彈出式菜單;左鍵雙擊彈出一個對話框
(3)用戶對托盤的所有消息都會發送到消息響應函數_OnIconNotify中。
(4)在頭文件中添加WM_HIDE_WORKING_WINDOW、WM_START_DEBUGER等消息號的定義,例如:
#define WM_HIDE_WORKING_WINDOW WM_USER +4
4、在窗口的OnWindowPosChanging函數中添加如下代碼:
void CTestDlg::OnWindowPosChanging(WINDOWPOS* lpwndpos)
{
if(m_IsWindowHide)
lpwndpos->flags &= ~SWP_SHOWWINDOW;
CDialog::OnWindowPosChanging(lpwndpos);
// TODO: Add your message handler code here
}
5、爲托盤的右鍵彈出的菜單項添加響應函數,以“隱藏鎖定窗口”菜單項(對應消息號爲WM_HIDE_WORKING_WINDOW)爲例
(1)在頭文件中添加消息響應函數的聲明:
afx_msg void OnHideWorkingMenu();
(2)在cpp文件中的BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之間添加消息與函數的映射宏:
ON_COMMAND(WM_HIDE_WORKING_WINDOW,OnHideWorkingMenu)
(3)在cpp文件中添加函數的實現,代碼略。