在软件开发过程中,有时会遇到应用程序要求具有全屏显示功能。全屏显示在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退出全屏,你还能退出来吗?那就把全屏状态下的“全屏显示”菜单项禁用吧! |
文档-视图结构下MFC程序的全屏显示
最新推荐文章于 2024-09-19 10:43:49 发布
2007年05月08日 星期二 15:43