实现全屏主要就是两个工作:
<1>让框架窗口的客户区占满整个屏幕,
<2> 退出全屏后恢复窗口之前的大小和位置,以实现全屏模式和非全屏模式的切换
我是这样进行实现的:
<1>在主窗口内加入三个成员变量:
BOOL m_bFullScreen ; //代表当前窗口的状态是否为全屏的标志
CRect * m_pFullScreenRect ; //保存在全屏状态下时的窗口的窗口矩形
WINDOWPLACEMENT m_OldWndPlacement ; //保存进入全屏前的窗口放置信息(大小,位置等)
<2>定义进人全屏操作的函数和退出全屏操作的函数 (当然,也可以就定义一个函数)
void CMainFrame::OnFullscreen()
{
if(m_bFullScreen)
{
EndFullScreen();
return;
}
//获取并保存当前窗口的位置,以便退出全屏时进行恢复
GetWindowPlacement(&m_OldWndPlacement);
// 获取屏幕的大小
int nFullHeight = GetSystemMetrics(SM_CYSCREEN);
int nFullWidth = GetSystemMetrics(SM_CXSCREEN);
//创建一个新的客户区区域,使它正好覆盖全屏
CRect clientRect;
clientRect.left = 0;
clientRect.right = nFullWidth;
clientRect.top = 0;
clientRect.bottom = nFullHeight;
//根据要使用的客户区区域信息计算出此客户区需要的窗口的区域信息并保存在参数内
CalcWindowRect(&clientRect);
//把窗口全屏时它的区域信息保存到成员变量中去
m_pFullScreenRect->CopyRect(&clientRect);
/*
//调用MoveWindow操作将窗口移动到全屏对应的正确区域. 注意: 因为MoveWindow要发出 WM_GETMINMAXINFO
//消息,通过对此消息的处理可以确认和更正窗口区域是否在最大和最小之间。因为我们要让窗口全屏,因此就要
//在全屏时使用我们设定的窗口区域作为最大区域的判定数据,而在非全屏时,就应该使用系统默认的数据来进行
//判定,因此应该在调用MoveWindow之前先设定全屏标志为真,以保证在处理WM_GETMINMAXINFO时使用正确的区域来进行最大化判定
*/
MoveWindow(m_pFullScreenRect);
//设定全屏标志为真
m_bFullScreen = true;
}
// 停止全屏显示的函数
void CMainFrame::EndFullScreen(void)
{
if(m_bFullScreen)
{
// hide the window
ShowWindow(SW_HIDE);
// recove the window placement
SetWindowPlacement(&m_OldWndPlacement);
// 设定全屏状态标志为假
m_bFullScreen = false;
}
}
<3>重写WM_GETMINMAXINFO消息的处理函数
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事件的处理和全屏函数关联起来,例如菜单和工具栏按钮等。