在软件开发过程中,有时会遇到应用程序要求具有全屏显示功能。全屏显示在Windows程序中,不同的工程类型,有不同的实现方法。实现的结果也不一样,有真全屏和假全屏之分,真全屏是将要显示的内容独占显示设备所有的全部资源,程序不加载窗外的框架。另一种是假全屏,实现的原理是调整要显示的内容的尺寸与位置,使之正好充满整个屏幕。假全屏的很好的例子就是如Word、Internet Explorer的全屏显示。
下面主要介绍一下在VC++6.0环境下,基于MFC的文档/视图框架应用程序的全屏显示的实现方法。这是一种假全屏显示。通过菜单控制全屏显示,在全屏模式下按ESC键退出全屏显示。
首先,在你的文档/视图(这里建立单文档视图)应用程序中,找到CMainFrame类的声明,在类内增加三个私有变量:
WINDOWPLACEMENT m_oldWndPlacement; //原窗口位置
BOOL bFullScreen;
CRect m_rcFullScreen; //表示全屏显示时的窗口位置
添加全屏状态函数
//-----------------------------------------------------------------------
// 函数名 : CMainFrame::OnFullscreen
// 说明 : 全屏状态
// 返回 : void
// 作者 : Teng
// 创建时间 : 2009-5-31 13:48:54
// 最后修改 : 2009-5-31
//-----------------------------------------------------------------------
void CMainFrame::OnFullscreen()
{
GetWindowPlacement( &m_oldWndPlacement ); //获得并保存当前窗口的位置
CRect rcWindow;
GetWindowRect( &rcWindow );
CRect rcClient;
GetClientRect( &rcClient );
//重置视图的所有控制条位置
RepositionBars( 0, 0xFFFF, AFX_IDW_PANE_FIRST, reposQuery, &rcClient );
ClientToScreen( &rcClient );
//得到屏幕分辨率
int nFullScreenW = GetSystemMetrics( SM_CXSCREEN );
int nFullScreenH = GetSystemMetrics( SM_CYSCREEN );
//将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域,
//将(0,0)和(nFullWidth, nFullHeight)两个点扩充原窗口和除控制条之外的客户区位置间的差值,
//就得到全屏显示的窗口位置
m_rcFullScreen.left = rcWindow.left- rcClient.left ;
m_rcFullScreen.top = rcWindow.top - rcClient.top ;
m_rcFullScreen.right = rcWindow.right - rcClient.right + nFullScreenW;
m_rcFullScreen.bottom = rcWindow.bottom - rcClient.bottom + nFullScreenH;
// 进入全屏显示状态
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
wp.flags = 0;
wp.showCmd = SW_SHOWNORMAL;
wp.rcNormalPosition = m_rcFullScreen;
SetWindowPlacement( &wp );
}
//接下来,通过ClassWizard重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置信息
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
if ( bFullScreen ){
lpMMI->ptMaxSize.x = m_rcFullScreen.Width();
lpMMI->ptMaxSize.y = m_rcFullScreen.Height();
lpMMI->ptMaxPosition.x = m_rcFullScreen.Width();
lpMMI->ptMaxPosition.y = m_rcFullScreen.Height();
lpMMI->ptMaxTrackSize.x = m_rcFullScreen.Width();
lpMMI->ptMaxTrackSize.y = m_rcFullScreen.Height();
}
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
//-----------------------------------------------------------------------
// 函数名 : CMainFrame::changeFullScreen
// 说明 : 改变屏幕当前状态,全屏还是非全屏
// 返回 : void
// 作者 : Teng
// 创建时间 : 2009-5-31 13:25:07
// 最后修改 : 2009-5-31
//-----------------------------------------------------------------------
void CMainFrame::changeFullScreen()
{
bFullScreen = !bFullScreen;
if ( bFullScreen ){
OnFullscreen();
}else{
ShowWindow( SW_SHOWNORMAL );
SetWindowPlacement( &m_oldWndPlacement );
}
}
然后在view中添加控制开关
void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if ( ( nChar == VK_RETURN ) && ::GetKeyState(VK_SHIFT) < 0 ){
TRACE("Change state!\n");
CMainFrame* pWnd = (CMainFrame*)AfxGetMainWnd();
if ( pWnd ){
pWnd->changeFullScreen();
}
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
FullScreen代码下载
posted on 2010-05-31 13:53
风轻云淡 阅读(1038)
评论(0) 编辑 收藏 引用 所属分类:
VC