首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

MFC SDI 應用程式實現專業全螢幕模式:選單切換、Esc 退出與視窗狀態保存

     編輯:VC 教學

功能需求

  • 選單「檢視 → 全螢幕」切換全螢幕模式。
  • 全螢幕時隱藏標題列、選單列、工具列、狀態列。
  • 按 Esc 鍵退出全螢幕,恢復原視窗位置大小。

核心實作 (CMainFrame)

1. 成員變數


class CMainFrame : public CFrameWnd
{
    WINDOWPLACEMENT m_wpPrev;   // 原視窗狀態
    BOOL            m_bFull;    // 全螢幕旗標
    CRect           m_rcFull;   // 全螢幕矩形
    // ...
};

2. 選單資源

資源編輯器:IDR_MAINFRAME → 「檢視」選單加入「全螢幕」,ID: ID_VIEW_FULLSCREEN。工具列同步加入按鈕 (同 ID)。

3. 進入全螢幕處理


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;
}

4. 限制最大化尺寸 (防止邊界溢出)


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);
}

5. 退出全螢幕


void CMainFrame::EndFullScreen()
{
    if (!m_bFull) return;
    ShowWindow(SW_HIDE); // 避免動畫閃爍
    SetWindowPlacement(&m_wpPrev);
    m_bFull = FALSE;
}

6. 視圖類處理 Esc 鍵


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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved