實現(xiàn)全屏主要就是兩個工作:
<1>讓框架窗口的客戶區(qū)占滿整個屏幕,
<2> 退出全屏后恢復(fù)窗口之前的大小和位置,以實現(xiàn)全屏模式和非全屏模式的切換
我是這樣進行實現(xiàn)的:
<1>在主窗口內(nèi)加入三個成員變量:
BOOL m_bFullScreen ; //代表當(dāng)前窗口的狀態(tài)是否為全屏的標(biāo)志
CRect * m_pFullScreenRect ; //保存在全屏狀態(tài)下時的窗口的窗口矩形
WINDOWPLACEMENT m_OldWndPlacement ; //保存進入全屏前的窗口放置信息(大小,位置等)
<2>定義進人全屏操作的函數(shù)和退出全屏操作的函數(shù) (當(dāng)然,也可以就定義一個函數(shù))
void CMainFrame::OnFullscreen()
{
if(m_bFullScreen)
{
EndFullScreen();
return;
}
//獲取并保存當(dāng)前窗口的位置,以便退出全屏?xí)r進行恢復(fù)
GetWindowPlacement(&m_OldWndPlacement);
// 獲取屏幕的大小
int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
//創(chuàng)建一個新的客戶區(qū)區(qū)域,使它正好覆蓋全屏
CRect clientRect;
clientRect.left = 0;
clientRect.right = nFullWidth;
clientRect.top = 0;
clientRect.bottom = nFullHeight;
//根據(jù)要使用的客戶區(qū)區(qū)域信息計算出此客戶區(qū)需要的窗口的區(qū)域信息并保存在參數(shù)內(nèi)
CalcWindowRect(&clientRect);
//把窗口全屏?xí)r它的區(qū)域信息保存到成員變量中去
m_pFullScreenRect->CopyRect(&clientRect);
/*
//調(diào)用MoveWindow操作將窗口移動到全屏對應(yīng)的正確區(qū)域. 注意: 因為MoveWindow要發(fā)出 WM_GETMINMAXINFO
//消息,通過對此消息的處理可以確認(rèn)和更正窗口區(qū)域是否在最大和最小之間。因為我們要讓窗口全屏,因此就要
//在全屏?xí)r使用我們設(shè)定的窗口區(qū)域作為最大區(qū)域的判定數(shù)據(jù),而在非全屏?xí)r,就應(yīng)該使用系統(tǒng)默認(rèn)的數(shù)據(jù)來進行
//判定,因此應(yīng)該在調(diào)用MoveWindow之前先設(shè)定全屏標(biāo)志為真,以保證在處理WM_GETMINMAXINFO時使用正確的區(qū)域來進行最大化判定
*/
MoveWindow(m_pFullScreenRect);
//設(shè)定全屏標(biāo)志為真
m_bFullScreen = true;
}
// 停止全屏顯示的函數(shù)
void CMainFrame::EndFullScreen(void)
{
if(m_bFullScreen)
{
// hide the window
ShowWindow(SW_HIDE);
// recove the window placement
SetWindowPlacement(&m_OldWndPlacement);
// 設(shè)定全屏狀態(tài)標(biāo)志為假
m_bFullScreen = false;
}
}
<3>重寫WM_GETMINMAXINFO消息的處理函數(shù)
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
if(m_bFullScreen)
{
lpMMI->ptMaxSize.x = m_pFullScreenRect->Width();
lpMMI->ptMaxSize.y = m_pFullScreenRect->Height();
lpMMI->ptMaxPosition.x = m_pFullScreenRect->Width();
lpMMI->ptMaxPosition.y = m_pFullScreenRect->Height();
lpMMI->ptMaxTrackSize.x = m_pFullScreenRect->Width();
lpMMI->ptMaxTrackSize.y = m_pFullScreenRect->Height();
}
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
<4> 將GUI事件的處理和全屏函數(shù)關(guān)聯(lián)起來,例如菜單和工具欄按鈕等。