您的位置:首页 > 其它

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

2012-02-11 13:08 295 查看
转自




痞子龙3D编程



在软件开发过程中,有时会遇到应用程序要求具有全屏显示功能。全屏显示在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退出全屏,你还能退出来吗?那就把全屏状态下的“全屏显示”菜单项禁用吧!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: