圖片瀏覽器、影片播放器常需「真全螢幕」:隱藏標題列、選單、工具列、狀態列,讓檢視區填滿整個螢幕,並提供浮動工具列供使用者退出全螢幕。MFC 沒有內建此功能,本文提供一個可重複使用的 CMainFrame 擴充方案。
WINDOWPLACEMENT)WM_GETMINMAXINFO 允許視窗超出螢幕範圍CBRS_FLOATING),提供「退出全螢幕」按鈕m_bFullScreen 控制選單勾選與繪製提示class CMainFrame : public CMDIFrameWnd {
// ...
BOOL m_bFullScreen = FALSE;
WINDOWPLACEMENT m_wpPrev; // 儲存原視窗狀態
CRect m_FullScreenWindowRect; // 全螢幕目標矩形
CToolBar* m_pwndFullScrnBar = nullptr; // 浮動工具列
};
OnViewFullScreen()void CMainFrame::OnViewFullScreen() {
WINDOWPLACEMENT wpNew;
RECT rectDesktop;
if (!m_bFullScreen) { // 進入全螢幕
// 隱藏 UI 元素
m_wndStatusBar.ShowWindow(SW_HIDE);
m_wndToolBar.ShowWindow(SW_HIDE);
// 備份目前視窗狀態
GetWindowPlacement(&m_wpPrev);
m_wpPrev.length = sizeof(m_wpPrev);
// 計算全螢幕矩形(含非客戶區調整)
::GetWindowRect(::GetDesktopWindow(), &rectDesktop);
::AdjustWindowRectEx(&rectDesktop, GetStyle(), TRUE, GetExStyle());
m_FullScreenWindowRect = rectDesktop;
wpNew = m_wpPrev;
wpNew.showCmd = SW_SHOWNORMAL;
wpNew.rcNormalPosition = rectDesktop;
// 建立浮動工具列
m_pwndFullScrnBar = new CToolBar;
if (!m_pwndFullScrnBar->Create(this, CBRS_SIZE_DYNAMIC | CBRS_FLOATING) ||
!m_pwndFullScrnBar->LoadToolBar(IDR_FULLSCREEN)) {
TRACE0("Failed to create toolbar\n");
return;
}
m_pwndFullScrnBar->EnableDocking(0); // 禁止停靠
m_pwndFullScrnBar->SetWindowPos(nullptr, 100, 100, 0, 0,
SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
m_pwndFullScrnBar->SetWindowText(_T("Full Screen"));
FloatControlBar(m_pwndFullScrnBar, CPoint(100, 100));
m_bFullScreen = TRUE;
}
else { // 退出全螢幕
m_pwndFullScrnBar->DestroyWindow();
delete m_pwndFullScrnBar;
m_pwndFullScrnBar = nullptr;
m_bFullScreen = FALSE;
m_wndStatusBar.ShowWindow(SW_SHOWNORMAL);
m_wndToolBar.ShowWindow(SW_SHOWNORMAL);
wpNew = m_wpPrev;
}
SetWindowPlacement(&wpNew);
}
OnGetMinMaxInfo()void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI) {
if (m_bFullScreen) {
lpMMI->ptMaxSize.y = m_FullScreenWindowRect.Height();
lpMMI->ptMaxTrackSize.y = lpMMI->ptMaxSize.y;
lpMMI->ptMaxSize.x = m_FullScreenWindowRect.Width();
lpMMI->ptMaxTrackSize.x = lpMMI->ptMaxSize.x;
}
CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
}
BOOL CMainFrame::IsFullScreen() { return m_bFullScreen; }
void CMainFrame::OnUpdateViewFullScreen(CCmdUI* pCmdUI) {
pCmdUI->Enable();
pCmdUI->SetCheck(m_bFullScreen ? 1 : 0);
}
在 CView::OnDraw() 中繪製提示文字,告知使用者如何退出:
void CPictureView::OnDraw(CDC* pDC) {
// ... 繪製圖片 ...
if (GetParentFrame()->IsFullScreen()) {
CRect rc; GetClientRect(&rc);
pDC->DrawText(_T("按 Ctrl+U 或雙擊滑鼠左鍵退出全螢幕"),
&rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
}

ON_COMMAND(ID_VIEW_FULLSCREEN, OnViewFullScreen) 綁定選單與快速鍵完整原始碼請參考本文配套下載。此方案已在 VC6.0 + Win2000 SP3 驗證,亦相容於新版 Visual Studio。