參考 Visual Studio IDE 的「全螢幕」模式 (選單 View → Full Screen),本文實作一套完整的 MFC SDI 應用程式全螢幕切換機制:保存還原視窗狀態、隱藏控制列、佔滿螢幕工作區、Esc 鍵退出還原。
class CMainFrame : public CFrameWnd
{
private:
WINDOWPLACEMENT m_OldWndPlacement; // 原始視窗佈局
BOOL m_bFullScreen; // 全螢幕狀態旗標
CRect m_FullScreenRect; // 全螢幕目標矩形
protected:
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// ... 訊息映射
afx_msg void OnFullScreen(); // 選單/工具列按鈕
afx_msg void OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI);
public:
void EndFullScreen(); // 公開退出介面
};
void CMainFrame::OnFullScreen()
{
// 1. 保存當前視窗佈局 (含最大化/最小化/正常狀態)
GetWindowPlacement(&m_OldWndPlacement);
// 2. 計算「客戶區不含控制列」的螢幕座標
CRect rcWindow, rcClient;
GetWindowRect(&rcWindow);
RepositionBars(0, 0xFFFF, AFX_IDW_PANE_FIRST, reposQuery, &rcClient);
ClientToScreen(&rcClient);
// 3. 取得螢幕解析度
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
// 4. 計算全螢幕時視窗外框矩形
// 視窗左上 = 原視窗左上 - 客戶區左上 (扣除控制列佔用)
// 視窗右下 = 原視窗右下 - 客戶區右下 + 螢幕尺寸
m_FullScreenRect.left = rcWindow.left - rcClient.left;
m_FullScreenRect.top = rcWindow.top - rcClient.top;
m_FullScreenRect.right = rcWindow.right - rcClient.right + cx;
m_FullScreenRect.bottom = rcWindow.bottom - rcClient.bottom + cy;
m_bFullScreen = TRUE;
// 5. 套用新佈局
WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) };
wp.flags = 0;
wp.showCmd = SW_SHOWNORMAL;
wp.rcNormalPosition = m_FullScreenRect;
SetWindowPlacement(&wp);
}
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
if (m_bFullScreen)
{
lpMMI->ptMaxSize = m_FullScreenRect.Size();
lpMMI->ptMaxPosition = m_FullScreenRect.TopLeft();
lpMMI->ptMaxTrackSize = m_FullScreenRect.Size(); // 拖曳最大限制
}
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
void CMainFrame::EndFullScreen()
{
if (m_bFullScreen)
{
ShowWindow(SW_HIDE); // 先隱藏避免閃爍
SetWindowPlacement(&m_OldWndPlacement); // 還原完整佈局
m_bFullScreen = FALSE;
}
}
void CMyView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if (nChar == VK_ESCAPE)
{
CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
pFrame->EndFullScreen();
}
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
IDR_MAINFRAME → View 下新增 ID_FULL_SCREEN,標題「Full Screen」。ID_FULL_SCREEN 即自動關聯。此實作完整保留原視窗狀態 (最大化/還原/位置/大小),退出後無縫銜接,體驗媲美專業 IDE。