在 CMainFrame 中新增成員變數追蹤狀態,並處理選單命令、視窗尺寸限制與 UI 更新:
m_bFullScreen:全螢幕狀態旗標m_FullScreenWindowRect:全螢幕視窗矩形m_wpPrev:保存正常模式視窗佈局(WINDOWPLACEMENT)m_wndFullScreenBar:全螢幕專用浮動工具列OnMenuFullscreenvoid CMainFrame::OnMenuFullscreen() {
RECT rectDesktop;
WINDOWPLACEMENT wpNew;
if (m_bFullScreen) { // 進入全螢幕
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_wndFullScreenBar = new CToolBar;
if (!m_wndFullScreenBar->Create(this, CBRS_SIZE_DYNAMIC|CBRS_FLOATING)
|| !m_wndFullScreenBar->LoadToolBar(IDR_FULLSCREEN)) {
TRACE0("Failed to create toolbar\n");
return;
}
m_wndFullScreenBar->EnableDocking(FALSE);
m_wndFullScreenBar->SetWindowPos(0, 100, 100, 0, 0,
SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_SHOWWINDOW);
m_wndFullScreenBar->SetWindowText(_T("全螢幕顯示"));
FloatControlBar(m_wndFullScreenBar, CPoint(100,100));
m_bFullScreen = TRUE;
}
else { // 恢復正常模式
m_wndFullScreenBar->DestroyWindow();
delete m_wndFullScreenBar;
m_bFullScreen = FALSE;
m_wndStatusBar.ShowWindow(SW_SHOWNORMAL);
m_wndToolBar.ShowWindow(SW_SHOWNORMAL);
wpNew = m_wpPrev;
}
SetWindowPlacement(&wpNew);
}
OnGetMinMaxInfovoid 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;
}
}
OnUpdateMenuFullscreenvoid CMainFrame::OnUpdateMenuFullscreen(CCmdUI* pCmdUI) {
pCmdUI->Enable();
pCmdUI->SetCheck(m_bFullScreen);
}
GetWindowPlacement/SetWindowPlacement 完整保存位置、大小、最大化/最小化狀態,切換無縫。AdjustWindowRectEx 依視窗風格調整矩形,確保客戶區精確覆蓋全螢幕。CBRS_FLOATING + EnableDocking(FALSE) 禁止停靠,FloatControlBar 定位。DestroyWindow 再 delete,避免資源洩漏。MonitorFromWindow + GetMonitorInfo 取得當前螢幕工作區。PreTranslateMessage 攔截 F11 呼叫此函數。AnimateWindow 增加切換視覺效果。