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

MFC 單文檔架構實現專業級全螢幕切換 (含 Esc 退出)

     編輯:關於VC++

參考 Visual Studio IDE 的「全螢幕」模式 (選單 View → Full Screen),本文實作一套完整的 MFC SDI 應用程式全螢幕切換機制:保存還原視窗狀態、隱藏控制列、佔滿螢幕工作區、Esc 鍵退出還原。

核心類別擴充:CMainFrame

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();               // 公開退出介面
};

1. 進入全螢幕 (OnFullScreen)

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

2. 限制視窗尺寸 (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);
}

3. 退出全螢幕

void CMainFrame::EndFullScreen()
{
    if (m_bFullScreen)
    {
        ShowWindow(SW_HIDE);                 // 先隱藏避免閃爍
        SetWindowPlacement(&m_OldWndPlacement); // 還原完整佈局
        m_bFullScreen = FALSE;
    }
}

4. 捕捉 Esc 鍵 (View 類別)

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 同為 ID_FULL_SCREEN 即自動關聯。

此實作完整保留原視窗狀態 (最大化/還原/位置/大小),退出後無縫銜接,體驗媲美專業 IDE。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved