如 VC++ IDE 的「檢視 → 全螢幕」功能,需隱藏標題列、選單、工具列、狀態列,讓客戶區佔滿螢幕,並支援 Esc 鍵還原。
class CMainFrame : public CFrameWnd {
private:
WINDOWPLACEMENT m_OldWndPlacement; // 原視窗狀態
BOOL m_bFullScreen = FALSE; // 全螢幕旗標
CRect m_FullScreenRect; // 全螢幕視窗矩形
// ...
};
在 IDR_MAINFRAME 的「檢視」選單加入「Full Screen」,ID 設為 ID_FULL_SCREEN,工具列同步加入按鈕並關聯相同 ID。
OnFullScreenvoid CMainFrame::OnFullScreen() {
GetWindowPlacement(&m_OldWndPlacement); // 保存原狀態
CRect winRect, clientRect;
GetWindowRect(&winRect);
RepositionBars(0, 0xFFFF, AFX_IDW_PANE_FIRST, reposQuery, &clientRect);
ClientToScreen(&clientRect);
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
// 計算全螢幕視窗矩形:客戶區對齊 (0,0)-(cx,cy),外擴非客戶區差值
m_FullScreenRect.left = winRect.left - clientRect.left;
m_FullScreenRect.top = winRect.top - clientRect.top;
m_FullScreenRect.right = winRect.right - clientRect.right + cx;
m_FullScreenRect.bottom = winRect.bottom - clientRect.bottom + cy;
m_bFullScreen = TRUE;
WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT), 0, SW_SHOWNORMAL, m_FullScreenRect };
SetWindowPlacement(&wp);
}
OnGetMinMaxInfo 限制最大化尺寸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);
}
EndFullScreenvoid 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);
}
WINDOWPLACEMENT 完整保存/恢復視窗狀態OnGetMinMaxInfo 防止使用者拖曳破壞全螢幕佈局此方案已驗證於 VC++ 6.0 SDI/MDI 專案,可直接整合至既有應用程式,提升專業度。