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


{
GetWindowPlacement( &m_oldWndPlacement ); //獲得并保存當前窗口的位置
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 );

//將除控制條外的客戶區全屏顯示到從(0,0)到(nFullWidth, nFullHeight)區域,
//將(0,0)和(nFullWidth, nFullHeight)兩個點擴充原窗口和除控制條之外的客戶區位置間的差值,
//就得到全屏顯示的窗口位置
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;
// 進入全屏顯示狀態
WINDOWPLACEMENT wp;
wp.length = sizeof(WINDOWPLACEMENT);
wp.flags = 0;
wp.showCmd = SW_SHOWNORMAL;
wp.rcNormalPosition = m_rcFullScreen;
SetWindowPlacement( &wp );
}
//接下來,通過ClassWizard重載CMainFrame類的OnGetMinMaxInfo函數,在全屏顯示時提供全屏顯示的位置信息
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);
}
//-----------------------------------------------------------------------
// 函數名 : CMainFrame::changeFullScreen
// 說明 : 改變屏幕當前狀態,全屏還是非全屏
// 返回 : void
// 作者 : Teng
// 創建時間 : 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中添加控制開關
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
風輕云淡 閱讀(1060)
評論(0) 編輯 收藏 引用 所屬分類:
VC