文档-视图结构下MFC程序的全屏显示

        在软件开发过程中,有时会遇到应用程序要求具有全屏显示功能。全屏显示在Windows程序中,不同的工程类型,有不同的实现方法。实现的结果也不一样,有真全屏和假全屏之分,真全屏是将要显示的内容独占显示设备所有的全部资源,程序不加载窗外的框架。另一种是假全屏,实现的原理是调整要显示的内容的尺寸与位置,使之正好充满整个屏幕。假全屏的很好的例子就是如Word、Internet Explorer的全屏显示。

        下面主要介绍一下在VC++6.0环境下,基于MFC的文档/视图框架应用程序的全屏显示的实现方法。这是一种假全屏显示。通过菜单控制全屏显示,在全屏模式下按ESC键退出全屏显示。

首先,在你的文档/视图(这里建立单文档视图)应用程序中,找到CMainFrame类的声明,在类内增加三个私有变量:

private:

       WINDOWPLACEMENT      m_OldWndPlacement;   //用来保存原窗口位置

       BOOL                                 m_bFullScreen;            //全屏显示标志

       CRect                                 m_FullScreenRect;       //表示全屏显示时的窗口位置

然后,设计用来控制全屏显示的菜单。在系统默认菜单“查看”下添加一个子菜单“全屏显示”,其属性ID设置为ID_FULL_SCREEN。打开VC中的ClassWizard(类向导),添加ID_FULL_SCREEN消息响应处理函数:void CMainFrame::OnFullScreen();在此函数中进行全屏显示的处理。函数的实现如下:

void CMainFrame::OnFullScreen()

{

       // TODO: Add your command handler code here

       GetWindowPlacement(&m_OldWndPlacement); //获得并保存当前窗口的位置

       CRect WindowRect;      //用来保存窗口矩形

       GetWindowRect(&WindowRect);        //获得并保存窗口矩形

       CRect ClientRect;   //用来保存视图矩形

       

       //重置视图的所有控制条位置

       RepositionBars(0, 0xffff, AFX_IDW_PANE_FIRST, reposQuery, &ClientRect);

       ClientToScreen(&ClientRect); //将视图坐标变换为窗口坐标

 

       //获取屏幕的分辨率

       int nFullWidth=GetSystemMetrics(SM_CXSCREEN);

       int nFullHeight=GetSystemMetrics(SM_CYSCREEN);

 

       //将除控制条外的客户区全屏显示到从(0,0)到(nFullWidth, nFullHeight)区域,

       //将(0,0)和(nFullWidth, nFullHeight)两个点扩充原窗口和除控制条之外的客户区位置间的差值,

       //就得到全屏显示的窗口位置

       m_FullScreenRect.left=WindowRect.left-ClientRect.left;

       m_FullScreenRect.top=WindowRect.top-ClientRect.top;

       m_FullScreenRect.right=WindowRect.right-ClientRect.right+nFullWidth;

       m_FullScreenRect.bottom=WindowRect.bottom-ClientRect.bottom+nFullHeight;

       m_bFullScreen=TRUE; //设置全屏显示标志为 TRUE

       // 进入全屏显示状态

       WINDOWPLACEMENT wndpl;

       wndpl.length=sizeof(WINDOWPLACEMENT);

       wndpl.flags=0;

       wndpl.showCmd=SW_SHOWNORMAL;

       wndpl.rcNormalPosition=m_FullScreenRect;

       SetWindowPlacement(&wndpl);   

 

}

 

接下来,通过ClassWizard重载CMainFrame类的OnGetMinMaxInfo函数,在全屏显示时提供全屏显示的位置信息。函数的实现如下:

void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI)

{

       // TODO: Add your message handler code here and/or call default

       if(m_bFullScreen)

       {

              lpMMI->ptMaxSize.x=m_FullScreenRect.Width();

              lpMMI->ptMaxSize.y=m_FullScreenRect.Height();

              lpMMI->ptMaxPosition.x=m_FullScreenRect.Width();

              lpMMI->ptMaxPosition.y=m_FullScreenRect.Height();

              //最大的Track尺寸也要改变

              lpMMI->ptMaxTrackSize.x=m_FullScreenRect.Width();

              lpMMI->ptMaxTrackSize.y=m_FullScreenRect.Height();

       }

       CFrameWnd::OnGetMinMaxInfo(lpMMI);

}

最后,在CMainFrame类的构造函数里对m_bFullScreen赋初始值为FALSE。否则程序有可能显示不正常。

 

到这里,程序已经能够通过点击菜单完成全屏显示功能。那么,如何使程序退出全屏模式,恢复原来的窗口显示呢?在CMianFrame类里要加一个处理结束全屏函数:void CMainFrame::EndFullScreen()。

函数的实现如下:

void CMainFrame::EndFullScreen()

{

       if(m_bFullScreen)

       {

              //退出全屏显示, 恢复原窗口显示

              ShowWindow(SW_HIDE);

              SetWindowPlacement(&m_OldWndPlacement);

              m_bFullScreen=FALSE;        //退出全屏时设置全屏标志为FALSE

       }

}

但是,该函数并消息映射函数,不能自动执行。这里设计为在全屏模式下按下ESC键调用该函数。按键的消息映射函数设计在视图类中。

在视图类里添加WM_KEYDOWN消息映射函数。实现如下:

void CXXXView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)

{

       // TODO: Add your message handler code here and/or call default

       if(nChar==VK_ESCAPE) //如果按的键为Esc键

       {

              //获取主框架窗口的指针

              CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;

              // 调用主窗口类的自定义函数 EndFullScreen ,便可退出全屏显示状态

              pFrame->EndFullScreen();

       }     

       CView::OnKeyDown(nChar, nRepCnt, nFlags);

}

注意不要忘了在视图类实现文件头加一句#include "MainFrm.h"。

好了,到此,全部功能已经实现了,编译一下你的程序,你的程序是不是已经可以全屏了?

实际上,这里面还有一个不容易发现的程序异常。当你已经在全屏状态下,通过快捷键Alt+V把菜单调出来,再点一下“全屏显示”,试着按ESC退出全屏,你还能退出来吗?那就把全屏状态下的“全屏显示”菜单项禁用吧!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值