`
huozheleisi
  • 浏览: 1256585 次
文章分类
社区版块
存档分类
最新评论

MFC框架中视图窗口全屏显示

 
阅读更多

在MFC的视图文档结构中,视图永远在框架窗口的范围之内。本文介绍一种把视图全屏显示的方法,能使视图的大小占据整个显示器窗口。
方法要点1:扩大主框架窗口。因为视图的大小是随主框架窗口的大小自动调整的,所以首先要把主框比显示器窗口还大,以给视图留下足够占满显示器的空间。
方法要点2:把主框架窗口移到合适的位置,使视图的左上角正好在屏幕的左上角。
注意:对于不能自动按框架大小自动调整的视图,如被分割的视图,需要自己写程序,当主框架窗口的大小改变时,视图能跟随着改变大小,使视图窗口离主框架窗口的四周边距不变。
计算框架窗口在全屏时的大小可以使用下面的函数公式:
CRect FullScreenRect(CRect & rcFrame, CRect & rcView, CRect & rcScreen)
{
CRect rcMax;
rcMax.left = rcScreen.left+ rcFrame.left- rcView.left;
rcMax.top = rcScreen.top + rcFrame.top - rcView.top;
rcMax.right= rcScreen.right + rcFrame.right - rcView.right;
rcMax.bottom= rcScreen.bottom+ rcFrame.bottom- rcView.bottom;
returnrcMax;
}
rcFrame:当前框架窗口的矩形
rcView:视图窗口的矩形为
rcScreen:整个屏幕矩形为。
如果给出当前的框架窗口和视图窗口,我们就很容易计算出框架窗口在全屏时的大小和位置,如下面的函数。
CRect FullScreenRect(CWnd* pFrame, CWnd* pView)
{
CRect rcs(0,0, GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
if(pFrame==NULL || pView==NULL)
returnrcs;
CRect rcv, rcf;
pView->GetWindowRect(rcv);
pFrame->GetWindowRect(rcf);
returnFullScreenRect(rcf, rcv, rcs);
}
GetSystemMetrics(SM_CXSCREEN)和GetSystemMetrics(SM_CYSCREEN)用来获得当前屏幕的宽度和高度。
在扩大主框架窗口时,需要注意一个消息WM_GETMINMAXINFO。MFC通过这个消息获取窗口的最大尺寸。默认窗口的最大尺寸是实际屏幕的大小。如果我们要使主框架窗口比屏幕大,那么必需响应这个消息,以返回一个足够的尺寸。
WM_GETMINMAXINFO消息映射宏为ON_WM_GETMINMAXINFO()
响应函数声明为:afx_msgvoid OnGetMinMaxInfo(MINMAXINFO* lpMMI);
实现该消息的响应函数,可以参考下面的形式,假设框架窗口类为CXxxFrame(单文档框架):
voidCXxxFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
CWnd * pView = GetActiveView( );//单文档窗口,直接取VIEW
//多文档窗口应该使用 m_hWndMDIClient
//改为下面的样子:
// CWnd * pView = CWnd::FromeHandle(m_hWndMDIClient);
if(pView==NULL)
{
__super::OnGetMinMaxInfo(lpMMI);
return;
}
CPoint Point(FullScreenRect(this, pView).Size() );
lpMMI->ptMaxSize = Point;
lpMMI->ptMaxTrackSize = Point;
}
全屏显示时,我们使用SetWindowPos函数把框架窗口放大到应有的尺寸并移动到合适的位置。如下面的函数:
CRect FullScreenView(CWnd* pFrame, CWnd* pView)
{
CRect rcf;
pFrame->GetWindowRect(rcf);
pFrame->SetWindowPos(FullScreenRect(pFrame, pView) );
returnrcf;
}
该函数返回框架窗口的原来大小,在从全屏状态恢复时,使用SetWindowPos函数把框架窗口移到原来的位置即可。
我们把这些函数包装成一个类,输入为框架和视图窗口的句柄(因为有时我们无法获得一个永久的指针,所以使用句柄)。该类提供全屏、恢复、获取状态、和获取全屏时尺寸四个接口。上面所述各函数被定义为静态函数,可以单独作用。
当主框架为单文档时,使用现在的语句设置参数(假设m_FullScreen为CFullScreen的实例):
m_FullScreen.(SetFrameView(GetSafeHwnd(),GetActiveView()->GetSafeHwnd());
多文档框架,使用下面的语句:
m_FullScreen..SetFrameView(GetSafeHwnd(),m_hWndMDIClient);
然后就可以调用FullScreen和Restore函数来操作窗口了。
头文件FullScreen.h如下:
classCFullScreen{
public:
CFullScreen();
~CFullScreen();

voidSetFrameView(HWNDhwndFrame,HWNDhwndView);
voidFullScreen();
voidRestore();
boolIsFullScreen();
CSizeGetFullScreenSize();

staticCRectFullScreenView(CWnd*pFrame,CWnd*pView);
staticCRectFullScreenRect(CWnd*pFrame,CWnd*pView);
staticCRectFullScreenRect(CRect&rcFrame,CRect&rcView,CRect&rcScreen);

protected:
CRectm_rcRestore,m_rcMax;
HWNDm_hwndFrame,m_hwndView;
};
CPP文件如下:
#include"StdAfx.h"
#include
"FullScreen.h"

CFullScreen::CFullScreen()
{
m_rcRestore.SetRectEmpty();
m_hwndFrame
=NULL;
m_hwndView
=NULL;
m_rcMax.SetRect(
0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
}


CFullScreen::
~CFullScreen()
{
}


voidCFullScreen::SetFrameView(HWNDhwndFrame,HWNDhwndView)
{
m_hwndFrame
=hwndFrame;
m_hwndView
=hwndView;
}

voidCFullScreen::FullScreen()
{
if(IsFullScreen())
return;
m_rcMax
=FullScreenRect(CWnd::FromHandle(m_hwndFrame),CWnd::FromHandle(m_hwndView));
m_rcRestore
=FullScreenView(CWnd::FromHandle(m_hwndFrame),CWnd::FromHandle(m_hwndView));
}

voidCFullScreen::Restore()
{
if(!IsFullScreen())
return;
if(CWnd::FromHandle(m_hwndFrame)!=NULL)
CWnd::FromHandle(m_hwndFrame)
->MoveWindow(m_rcRestore);

m_rcRestore.SetRectEmpty();
m_rcMax.SetRect(
0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));
}

boolCFullScreen::IsFullScreen()
{
return!m_rcRestore.IsRectEmpty();
}

CSizeCFullScreen::GetFullScreenSize()
{
returnm_rcMax.Size();
}


CRectCFullScreen::FullScreenView(CWnd
*pFrame,CWnd*pView)
{
CRectrcf(
0,0,0,0);
if(pFrame==NULL)
returnrcf;

pFrame
->GetWindowRect(rcf);
pFrame
->MoveWindow(FullScreenRect(pFrame,pView));
returnrcf;
}


CRectCFullScreen::FullScreenRect(CWnd
*pFrame,CWnd*pView)
{
CRectrcs(
0,0,GetSystemMetrics(SM_CXSCREEN),
GetSystemMetrics(SM_CYSCREEN));

if(pFrame==NULL||pView==NULL)
returnrcs;

CRectrcv,rcf;
pView
->GetWindowRect(rcv);
pFrame
->GetWindowRect(rcf);

CRectrcMax
=FullScreenRect(rcf,rcv,rcs);
if(rcMax.Width()<rcs.Width()||rcMax.Height()<rcs.Height())
returnrcs;

returnrcMax;
}

CRectCFullScreen::FullScreenRect(CRect
&rcFrame,CRect&rcView,CRect&rcScreen)
{
CRectrcMax;
rcMax.left
=rcScreen.left+rcFrame.left-rcView.left;
rcMax.top
=rcScreen.top+rcFrame.top-rcView.top;
rcMax.right
=rcScreen.right+rcFrame.right-rcView.right;
rcMax.bottom
=rcScreen.bottom+rcFrame.bottom-rcView.bottom;
returnrcMax;
}

http://blog.csdn.net/sgdgoodboy/archive/2008/05/22/2468285.aspx

分享到:
评论

相关推荐

    视图窗口的全屏 MFC

    在MFC中实现视图窗口全屏显示涉及对框架窗口(Frame Window)和视图类(View Class)的处理。 标题"视图窗口的全屏MFC"所指的就是如何在MFC应用程序中让视图窗口在启动时即以全屏模式呈现。这通常涉及到调整窗口...

    MFC框架程序中全屏显示特性的实现.zip_MFC 全屏_MFC 全屏显示_c++ 全屏_全屏 显示_全屏显示

    本教程将深入探讨如何在MFC框架程序中实现全屏显示特性,这对于游戏开发、多媒体应用或者需要沉浸式体验的软件来说至关重要。 全屏显示在MFC中实现的核心在于改变窗口的样式,并调整窗口大小以适应整个屏幕。以下是...

    通过MFC实现全屏功能(全屏及还原)

    本文将深入探讨如何使用MFC在Visual Studio 2010中实现窗口的全屏和还原功能。 首先,我们需要了解MFC中的CWnd类,它是所有MFC窗口对象的基础类。在MFC程序中,我们通常会继承CWnd或其派生类(如CFrameWnd、...

    MFC用以实现全屏显示

    首先,要理解MFC框架的工作原理,它是基于Windows API的,它将许多底层API封装成了易于使用的C++类。当我们创建一个MFC应用程序时,通常会从CWinApp派生一个类,用于应用程序的初始化、运行和清理。此外,我们还会从...

    MFC-fullScreen.rar_FullScreen M_MFC_MFC 全屏 程序_MFC 全屏显示

    本案例"FullScreen M_MFC_MFC 全屏 程序_MFC 全屏显示"是一个使用MFC实现全屏功能的经典示例,主要涉及如何在MFC应用中切换到全屏模式。 全屏模式是指将应用程序的窗口扩展到显示器的整个工作区域,隐藏任务栏、...

    CWnd窗口的全屏显示

    CWnd是MFC中的基础窗口类,它是所有窗口对象的基类,包括对话框、视图、框架窗口等。CWnd提供了创建、管理窗口以及处理消息的基础方法。 要实现CWnd窗口的全屏显示,你需要执行以下步骤: 1. **创建窗口**: - ...

    MFC 全屏实现代码

    首先,我们要了解MFC框架中的关键类,如CWinApp、CFrameWnd和CView,它们分别代表应用程序、主框架窗口和视图。全屏模式的切换通常涉及到对这些窗口类的处理。 1. **CFrameWnd**:这是MFC中的顶级窗口类,它代表一...

    mfc全屏显示

    在MFC(Microsoft Foundation Classes)框架中,全屏显示是一个常见的需求,特别是在开发游戏或多媒体应用时。MFC提供了一种方法,通过自定义窗口样式和消息处理来实现全屏模式。下面我们将深入探讨如何利用MFC实现...

    MFC单文档全屏布局

    "MFC单文档全屏布局"涉及到的知识点主要集中在如何利用MFC库实现一个应用程序,使得其主窗口能够占据整个屏幕,达到全屏显示的效果。下面将详细介绍这一主题,并结合"CTEst"这个类的使用进行阐述。 首先,MFC中的...

    MFC动画全屏

    在资源视图中,添加一个自定义控件,用于显示动画。这个控件可以是CStatic派生类,我们可以通过重载OnPaint()函数来绘制动画帧。 标题"MFC动画全屏"表明我们要实现的是一个全屏的MFC应用。全屏模式通常通过改变窗口...

    c++中窗口的全屏化

    4. **视图和文档**:`View.cpp`和`Doc.cpp`分别对应MFC框架中的视图类和文档类。视图类通常负责显示和处理窗口上的数据,而文档类则存储数据。在全屏化过程中,视图可能需要调整其画布大小以适应全屏尺寸,而文档则...

    在Visual+C中实现MDI应用程序的活动视图全屏显示.pdf

    在Visual C++中,MDI(Multiple Document Interface)应用程序允许用户在同一窗口中处理多个文档,而活动视图全屏显示则是提升用户体验的一种常见需求。本文将详细介绍如何在VC++6.0环境下,通过编程实现MDI应用程序...

    MFC全屏显示

    2. **框架窗口交互**:通过`AfxGetApp()-&gt;m_pMainWnd`获取到主框架窗口的指针,这样可以在视图类中调用主窗口的方法。 3. **状态变量定义**:在主框架窗口类(CMainFrame)中定义状态变量来记录全屏模式是否开启、...

    MFC全屏截图软件C++源码

    MFC框架包括事件驱动模型、文档/视图架构、资源管理等核心组件。 2. **C++编程**:C++作为基础,是这个项目的编程语言。开发者需要掌握C++的基本语法,包括类、对象、继承、多态等面向对象特性,以及指针、内存管理...

    VC MFC 在DOC-VIEW中实现全屏幕显示

    全屏显示的实现主要涉及到修改视图窗口和框架窗口的大小及位置。 实现全屏显示的基本步骤如下: 1. **创建一个自定义视图类**:继承自`CView`,并重写`OnInitialUpdate`和`OnSize`等方法,以在视图初始化和窗口...

    VC++ 6.0多文档界面全屏显示代码源程序

    可能包含一个成员函数,如`ToggleFullScreen()`,这个函数会在当前窗口全屏和正常模式之间切换。在响应某个用户事件(如菜单项点击或快捷键)时,调用此函数。 除了核心的全屏逻辑,源程序可能还包括以下组件: - ...

    OpenGL.rar_MFC 窗口_OpenGL MFC_mfc and opengl_mfc opengl_opengl

    在本资源“OpenGL.rar”中,我们看到的是将OpenGL集成到MFC框架中的示例,这允许开发者使用MFC的便利性来构建具有OpenGL图形功能的应用程序。 MFC窗口与OpenGL结合,可以创建一个OpenGL上下文,这是OpenGL进行渲染...

    C++,基于MFC的多媒体播放器

    总结,基于MFC的C++多媒体播放器开发涵盖了Windows编程基础、MFC框架、ActiveX技术、用户界面设计、事件处理等多个方面的知识。通过这个项目,开发者不仅可以提升对MFC的理解,还能掌握多媒体播放的相关技术,为今后...

    分割视图的另一种窗口切换,可以切换的不只是View。.docx

    在本文档中,我们探讨了一个在MFC应用程序中实现分割视图窗口切换的特殊需求。通常,分割视图允许用户在同一个界面中同时查看和操作多个视图,但这里的需求更进一步,需要在分割视图和全屏CFormView之间进行切换,...

    MFC 基于VLC的视频播放器(完整版)

    - **全屏显示**:MFC中的CWnd或CStatic子类可以调整大小和位置以实现全屏显示,同时处理好窗口边框和标题栏的隐藏与恢复。 - **播放列表操作**:使用libvlc_media_list_player API管理播放列表,添加、删除媒体,...

Global site tag (gtag.js) - Google Analytics