随笔 - 132  文章 - 51  trackbacks - 0
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用链接

留言簿(7)

随笔分类

随笔档案

文章分类

文章档案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新评论

阅读排行榜

评论排行榜

在软件开发过程中,有时会遇到应用程序要求具有全屏显示功能。全屏显示在Windows程序中,不同的工程类型,有不同的实现方法。实现的结果也不一样,有真全屏和假全屏之分,真全屏是将要显示的内容独占显示设备所有的全部资源,程序不加载窗外的框架。另一种是假全屏,实现的原理是调整要显示的内容的尺寸与位置,使之正好充满整个屏幕。假全屏的很好的例子就是如WordInternet 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( 00xFFFF, 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 风轻云淡 阅读(1041) 评论(0)  编辑 收藏 引用 所属分类: VC

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理