在軟件開發(fā)過程中,有時(shí)會(huì)遇到應(yīng)用程序要求具有全屏顯示功能。全屏顯示在Windows程序中,不同的工程類型,有不同的實(shí)現(xiàn)方法。實(shí)現(xiàn)的結(jié)果也不一樣,有真全屏和假全屏之分,真全屏是將要顯示的內(nèi)容獨(dú)占顯示設(shè)備所有的全部資源,程序不加載窗外的框架。另一種是假全屏,實(shí)現(xiàn)的原理是調(diào)整要顯示的內(nèi)容的尺寸與位置,使之正好充滿整個(gè)屏幕。假全屏的很好的例子就是如Word、Internet Explorer的全屏顯示。
下面主要介紹一下在VC++6.0環(huán)境下,基于MFC的文檔/視圖框架應(yīng)用程序的全屏顯示的實(shí)現(xiàn)方法。這是一種假全屏顯示。通過菜單控制全屏顯示,在全屏模式下按ESC鍵退出全屏顯示。
首先,在你的文檔/視圖(這里建立單文檔視圖)應(yīng)用程序中,找到CMainFrame類的聲明,在類內(nèi)增加三個(gè)私有變量:
WINDOWPLACEMENT m_oldWndPlacement; //原窗口位置
BOOL bFullScreen;
CRect m_rcFullScreen; //表示全屏顯示時(shí)的窗口位置
添加全屏狀態(tài)函數(shù)
//-----------------------------------------------------------------------
// 函數(shù)名 : CMainFrame::OnFullscreen
// 說明 : 全屏狀態(tài)
// 返回 : void
// 作者 : Teng
// 創(chuàng)建時(shí)間 : 2009-5-31 13:48:54
// 最后修改 : 2009-5-31
//-----------------------------------------------------------------------
void CMainFrame::OnFullscreen()


{
GetWindowPlacement( &m_oldWndPlacement ); //獲得并保存當(dāng)前窗口的位置
CRect rcWindow;
GetWindowRect( &rcWindow );
CRect rcClient;
GetClientRect( &rcClient );

//重置視圖的所有控制條位置
RepositionBars( 0, 0xFFFF, AFX_IDW_PANE_FIRST, reposQuery, &rcClient );
ClientToScreen( &rcClient );

//得到屏幕分辨率
int nFullScreenW = GetSystemMetrics( SM_CXSCREEN );
int nFullScreenH = GetSystemMetrics( SM_CYSCREEN );

//將除控制條外的客戶區(qū)全屏顯示到從(0,0)到(nFullWidth, nFullHeight)區(qū)域,
//將(0,0)和(nFullWidth, nFullHeight)兩個(gè)點(diǎn)擴(kuò)充原窗口和除控制條之外的客戶區(qū)位置間的差值,
//就得到全屏顯示的窗口位置
m_rcFullScreen.left = rcWindow.left- rcClient.left ;
m_rcFullScreen.top = rcWindow.top - rcClient.top ;
m_rcFullScreen.right = rcWindow.right - rcClient.right + nFullScreenW;
m_rcFullScreen.bottom = rcWindow.bottom - rcClient.bottom + nFullScreenH;
// 進(jìn)入全屏顯示狀態(tài)
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
wp.flags = 0;
wp.showCmd = SW_SHOWNORMAL;
wp.rcNormalPosition = m_rcFullScreen;
SetWindowPlacement( &wp );
}
//接下來,通過ClassWizard重載CMainFrame類的OnGetMinMaxInfo函數(shù),在全屏顯示時(shí)提供全屏顯示的位置信息
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)


{

if ( bFullScreen )
{
lpMMI->ptMaxSize.x = m_rcFullScreen.Width();
lpMMI->ptMaxSize.y = m_rcFullScreen.Height();
lpMMI->ptMaxPosition.x = m_rcFullScreen.Width();
lpMMI->ptMaxPosition.y = m_rcFullScreen.Height();
lpMMI->ptMaxTrackSize.x = m_rcFullScreen.Width();
lpMMI->ptMaxTrackSize.y = m_rcFullScreen.Height();
}
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
//-----------------------------------------------------------------------
// 函數(shù)名 : CMainFrame::changeFullScreen
// 說明 : 改變屏幕當(dāng)前狀態(tài),全屏還是非全屏
// 返回 : void
// 作者 : Teng
// 創(chuàng)建時(shí)間 : 2009-5-31 13:25:07
// 最后修改 : 2009-5-31
//-----------------------------------------------------------------------
void CMainFrame::changeFullScreen()


{
bFullScreen = !bFullScreen;

if ( bFullScreen )
{
OnFullscreen();

}else
{
ShowWindow( SW_SHOWNORMAL );
SetWindowPlacement( &m_oldWndPlacement );
}
}
然后在view中添加控制開關(guān)
void CFullScreenView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)


{

if ( ( nChar == VK_RETURN ) && ::GetKeyState(VK_SHIFT) < 0 )
{
TRACE("Change state!\n");
CMainFrame* pWnd = (CMainFrame*)AfxGetMainWnd();

if ( pWnd )
{
pWnd->changeFullScreen();
}
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
FullScreen代碼下載
posted on 2010-05-31 13:53
風(fēng)輕云淡 閱讀(1086)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
VC