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

MFC 程式實現真全螢幕模式:隱藏標題/工具/狀態列並支援浮動工具列切換

     編輯:關於VC++

前言

圖片瀏覽器、影片播放器常需「真全螢幕」:隱藏標題列、選單、工具列、狀態列,讓檢視區填滿整個螢幕,並提供浮動工具列供使用者退出全螢幕。MFC 沒有內建此功能,本文提供一個可重複使用的 CMainFrame 擴充方案。

核心原理

  1. 記錄進入全螢幕前的視窗佈局(WINDOWPLACEMENT)
  2. 計算桌面工作區矩形,調整視窗大小/位置覆蓋全螢幕
  3. 攔截 WM_GETMINMAXINFO 允許視窗超出螢幕範圍
  4. 建立浮動工具列(CBRS_FLOATING),提供「退出全螢幕」按鈕
  5. 狀態旗標 m_bFullScreen 控制選單勾選與繪製提示

關鍵成員變數

class CMainFrame : public CMDIFrameWnd {
    // ...
    BOOL m_bFullScreen = FALSE;
    WINDOWPLACEMENT m_wpPrev;           // 儲存原視窗狀態
    CRect m_FullScreenWindowRect;       // 全螢幕目標矩形
    CToolBar* m_pwndFullScrnBar = nullptr; // 浮動工具列
};

核心實現

切換全螢幕 OnViewFullScreen()

void CMainFrame::OnViewFullScreen() {
    WINDOWPLACEMENT wpNew;
    RECT rectDesktop;

    if (!m_bFullScreen) { // 進入全螢幕
        // 隱藏 UI 元素
        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_pwndFullScrnBar = new CToolBar;
        if (!m_pwndFullScrnBar->Create(this, CBRS_SIZE_DYNAMIC | CBRS_FLOATING) ||
            !m_pwndFullScrnBar->LoadToolBar(IDR_FULLSCREEN)) {
            TRACE0("Failed to create toolbar\n");
            return;
        }
        m_pwndFullScrnBar->EnableDocking(0); // 禁止停靠
        m_pwndFullScrnBar->SetWindowPos(nullptr, 100, 100, 0, 0,
            SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE | SWP_SHOWWINDOW);
        m_pwndFullScrnBar->SetWindowText(_T("Full Screen"));
        FloatControlBar(m_pwndFullScrnBar, CPoint(100, 100));

        m_bFullScreen = TRUE;
    }
    else { // 退出全螢幕
        m_pwndFullScrnBar->DestroyWindow();
        delete m_pwndFullScrnBar;
        m_pwndFullScrnBar = nullptr;
        m_bFullScreen = FALSE;

        m_wndStatusBar.ShowWindow(SW_SHOWNORMAL);
        m_wndToolBar.ShowWindow(SW_SHOWNORMAL);
        wpNew = m_wpPrev;
    }
    SetWindowPlacement(&wpNew);
}

允許視窗超出螢幕 OnGetMinMaxInfo()

void 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;
    }
    CMDIFrameWnd::OnGetMinMaxInfo(lpMMI);
}

狀態查詢與選單同步


BOOL CMainFrame::IsFullScreen() { return m_bFullScreen; }

void CMainFrame::OnUpdateViewFullScreen(CCmdUI* pCmdUI) {
    pCmdUI->Enable();
    pCmdUI->SetCheck(m_bFullScreen ? 1 : 0);
}

使用者體驗細節

在 CView::OnDraw() 中繪製提示文字,告知使用者如何退出:


void CPictureView::OnDraw(CDC* pDC) {
    // ... 繪製圖片 ...
    if (GetParentFrame()->IsFullScreen()) {
        CRect rc; GetClientRect(&rc);
        pDC->DrawText(_T("按 Ctrl+U 或雙擊滑鼠左鍵退出全螢幕"),
            &rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    }
}

執行效果

全螢幕狀態與浮動工具列

適用場景與擴充

  • 單文件/多文件 (SDI/MDI) 架構皆適用
  • 浮動工具列可擴充「縮放」、「列印」等常用功能
  • 搭配 ON_COMMAND(ID_VIEW_FULLSCREEN, OnViewFullScreen) 綁定選單與快速鍵

完整原始碼請參考本文配套下載。此方案已在 VC6.0 + Win2000 SP3 驗證,亦相容於新版 Visual Studio。

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