class CMainFrame : public CFrameWnd
{
WINDOWPLACEMENT m_wpPrev; // 原視窗狀態
BOOL m_bFull; // 全螢幕旗標
CRect m_rcFull; // 全螢幕矩形
// ...
};
資源編輯器:IDR_MAINFRAME → 「檢視」選單加入「全螢幕」,ID: ID_VIEW_FULLSCREEN。工具列同步加入按鈕 (同 ID)。
void CMainFrame::OnViewFullscreen()
{
if (m_bFull) { EndFullScreen(); return; }
// 1. 保存目前視窗狀態
GetWindowPlacement(&m_wpPrev);
// 2. 計算全螢幕矩形 (含工具列/狀態列高度)
CRect rcWnd, rcClient;
GetWindowRect(&rcWnd);
RepositionBars(0, 0xFFFF, AFX_IDW_PANE_FIRST, reposQuery, &rcClient);
ClientToScreen(&rcClient);
int cx = GetSystemMetrics(SM_CXSCREEN);
int cy = GetSystemMetrics(SM_CYSCREEN);
m_rcFull.left = rcWnd.left - rcClient.left;
m_rcFull.top = rcWnd.top - rcClient.top;
m_rcFull.right = rcWnd.right - rcClient.right + cx;
m_rcFull.bottom = rcWnd.bottom - rcClient.bottom + cy;
// 3. 套用全螢幕位置
WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT) };
wp.showCmd = SW_SHOWMAXIMIZED; // 或 SW_SHOWNORMAL
wp.rcNormalPosition = m_rcFull;
SetWindowPlacement(&wp);
m_bFull = TRUE;
}
void CMainFrame::OnGetMinMaxInfo(MINMAXINFO* lpMMI)
{
if (m_bFull)
{
lpMMI->ptMaxSize = m_rcFull.Size();
lpMMI->ptMaxPosition = m_rcFull.TopLeft();
lpMMI->ptMaxTrackSize = m_rcFull.Size();
}
CFrameWnd::OnGetMinMaxInfo(lpMMI);
}
void CMainFrame::EndFullScreen()
{
if (!m_bFull) return;
ShowWindow(SW_HIDE); // 避免動畫閃爍
SetWindowPlacement(&m_wpPrev);
m_bFull = 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);
}
SetMenu(NULL),退出時 SetMenu(&m_menu)。ShowControlBar(&m_wndToolBar, FALSE, FALSE) 切換可見性。MonitorFromWindow + GetMonitorInfo 取得工作區矩形,替代 SM_CXSCREEN。