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

VC++ 6.0 實現專業級全螢幕顯示:菜單觸發、Esc 退出與座標精確計算

     編輯:VC 教學

需求分析

如 VC++ IDE 的「檢視 → 全螢幕」功能,需隱藏標題列、選單、工具列、狀態列,讓客戶區佔滿螢幕,並支援 Esc 鍵還原。

核心實作步驟

1. CMainFrame 新增成員變數

class CMainFrame : public CFrameWnd {
private:
    WINDOWPLACEMENT m_OldWndPlacement; // 原視窗狀態
    BOOL m_bFullScreen = FALSE;        // 全螢幕旗標
    CRect m_FullScreenRect;            // 全螢幕視窗矩形
    // ...
};

2. 資源編輯器新增選單項

在 IDR_MAINFRAME 的「檢視」選單加入「Full Screen」,ID 設為 ID_FULL_SCREEN,工具列同步加入按鈕並關聯相同 ID。

3. 全螢幕切換處理函數 OnFullScreen

void CMainFrame::OnFullScreen() {
    GetWindowPlacement(&m_OldWndPlacement); // 保存原狀態

    CRect winRect, clientRect;
    GetWindowRect(&winRect);
    RepositionBars(0, 0xFFFF, AFX_IDW_PANE_FIRST, reposQuery, &clientRect);
    ClientToScreen(&clientRect);

    int cx = GetSystemMetrics(SM_CXSCREEN);
    int cy = GetSystemMetrics(SM_CYSCREEN);

    // 計算全螢幕視窗矩形:客戶區對齊 (0,0)-(cx,cy),外擴非客戶區差值
    m_FullScreenRect.left   = winRect.left - clientRect.left;
    m_FullScreenRect.top    = winRect.top  - clientRect.top;
    m_FullScreenRect.right  = winRect.right - clientRect.right + cx;
    m_FullScreenRect.bottom = winRect.bottom - clientRect.bottom + cy;

    m_bFullScreen = TRUE;
    WINDOWPLACEMENT wp = { sizeof(WINDOWPLACEMENT), 0, SW_SHOWNORMAL, m_FullScreenRect };
    SetWindowPlacement(&wp);
}

4. 重載 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);
}

5. 退出全螢幕函數 EndFullScreen

void CMainFrame::EndFullScreen() {
    if(m_bFullScreen) {
        ShowWindow(SW_HIDE);
        SetWindowPlacement(&m_OldWndPlacement);
        m_bFullScreen = 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);
}

關鍵點總結

  • 精確計算非客戶區差值,確保客戶區完美貼邊
  • 利用 WINDOWPLACEMENT 完整保存/恢復視窗狀態
  • OnGetMinMaxInfo 防止使用者拖曳破壞全螢幕佈局
  • Esc 鍵由視圖類捕獲,透過主框架指標回呼退出邏輯

結語

此方案已驗證於 VC++ 6.0 SDI/MDI 專案,可直接整合至既有應用程式,提升專業度。

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