MFC中视图的全屏显示

[转载自:http://www.sudu.cn/info/html/edu/20080403/260953.html]


我们经常会在程序中提供一个全屏显示的功能,如何实现呢?

第一步:声明FullScreenHandler类。

#ifndef __FullScreenHandler_h__
#define __FullScreenHandler_h__

class CFullScreenHandler
{ 
public:
    CFullScreenHandler();
    ~CFullScreenHandler();
    void Maximize(CFrameWnd* pFrame, CWnd* pView);
    void Restore(CFrameWnd* pFrame);
    BOOL InFullScreenMode() {  return !m_rcRestore.IsRectEmpty();  }
    CSize GetMaxSize();

protected:
    CRect m_rcRestore;
};

#endif  //__FullScrennHandler_h__

// Global instance
extern CFullScreenHandler FullScreenHandler;
第二步:实现FullScreenHandler类。

#include "FullScreenHandler.h"

// Global object handles full-screen mode
CFullScreenHandler FullScreenHandler;

CFullScreenHandler::CFullScreenHandler()
{ 
    m_rcRestore.SetRectEmpty();
}

CFullScreenHandler::~CFullScreenHandler()
{ 
}

//
// Resize frame so view’s client area fills the entire screen. Use
// GetSystemMetrics to get the screen size -- the rest is pixel
// arithmetic.
//
void CFullScreenHandler::Maximize(CFrameWnd* pFrame, CWnd* pView)
{ 
    // get view rectangle
    if (pView) { 
        CRect rcv;
        pView->GetWindowRect(&rcv);
        // get frame rectangle
        pFrame->GetWindowRect(m_rcRestore); // save for restore
        const CRect& rcf = m_rcRestore;             // frame rect
        // now compute new rect
        CRect rc(0,0, GetSystemMetrics(SM_CXSCREEN),
            GetSystemMetrics(SM_CYSCREEN));
        rc.left  += rcf.left  - rcv.left;
        rc.top   += rcf.top   - rcv.top;
        rc.right += rcf.right - rcv.right;
        rc.bottom+= rcf.bottom- rcv.bottom;
        // move frame!
        pFrame->SetWindowPos(NULL, rc.left, rc.top,
            rc.Width(), rc.Height(), SWP_NOZORDER);
    }
}

void CFullScreenHandler::Restore(CFrameWnd* pFrame)
{ 
    const CRect& rc = m_rcRestore;
    pFrame->SetWindowPos(NULL, rc.left, rc.top,
        rc.Width(), rc.Height(), SWP_NOZORDER);
    m_rcRestore.SetRectEmpty();
}

CSize CFullScreenHandler::GetMaxSize()
{ 
    CRect rc(0,0,
        GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
    rc.InflateRect(10,50);
    return rc.Size();
}

第三步:定义ID_VIEW_FULL_SCREEN资源,响应视图的WM_GETMINMAXINFO消息

    CRect m_rcRestore;
    afx_msg void OnGetMinMaxInfo(MINMAXINFO* lpmmi);

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_GETMINMAXINFO()
END_MESSAGE_MAP()

//
// Important to handle this in order to set size
// of window larger than whole screen.
//
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpmmi)
{ 
    CSize sz = FullScreenHandler.GetMaxSize();
    lpmmi->ptMaxSize = CPoint(sz);
    lpmmi->ptMaxTrackSize = CPoint(sz);
}

//
// View full screen mode. Calls CFullScreenHandler to do the work.
//
void CMainFrame::OnViewFullScreen()
{ 
    if (FullScreenHandler.InFullScreenMode())
        FullScreenHandler.Restore(this);
    else
        FullScreenHandler.Maximize(this, GetActiveView());
        //如果是拆分窗口则应为FullScreenHandler.Maximize(this, m_wndSplitter); 
}

//
// Put checkmark next to command if in full screen mode.
//
void CMainFrame::OnUpdateViewFullScreen(CCmdUI* pCmdUI)
{ 
    pCmdUI->SetCheck(FullScreenHandler.InFullScreenMode());
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值