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

BCB 實現全螢幕 OpenGL:WS_POPUP 視窗風格與動態解析度切換

     編輯:關於C++

在 C++ Builder (BCB) 中實現全螢幕獨佔模式 OpenGL 渲染,核心在於兩步:移除視窗邊框/標題列 (WS_POPUP) 與 切換顯示器解析度匹配視窗大小。本文提供完整 TForm 覆寫 CreateParams 範例與解析度切換工具函數。

核心步驟

  1. 覆寫 CreateParams 設定 WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS。
  2. 在 CreateParams 中呼叫 ChangeResolution(800, 600) 切換解析度。
  3. 設定 Params.Width/Height = 800/600、Params.X = Params.Y = 0 覆蓋全螢幕。
  4. 程式結束時還原解析度 (在 FormClose 呼叫 ChangeDisplaySettings(nullptr, 0))。

完整程式碼

// Unit1.h
class TForm1 : public TForm {
__published:
    // ...
protected:
    virtual void __fastcall CreateParams(TCreateParams &Params);
    virtual void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
};

// Unit1.cpp
void __fastcall TForm1::CreateParams(TCreateParams &Params)
{
    TForm::CreateParams(Params);
    // 1. 無邊框彈出視窗
    Params.Style = WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
    // 2. 切換解析度
    ChangeResolution(800, 600);
    // 3. 視窗佔滿螢幕
    Params.Width  = 800;
    Params.Height = 600;
    Params.X = Params.Y = 0;
}

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
    // 還原桌面解析度
    ChangeDisplaySettings(nullptr, 0);
}

// 解析度切換工具函數
BOOL ChangeResolution(DWORD w, DWORD h)
{
    DEVMODE dm = {0};
    dm.dmSize = sizeof(DEVMODE);
    LONG i = 0;
    // 尋找 16-bit 色深、指定寬高的模式
    while (EnumDisplaySettings(nullptr, i++, &dm)) {
        if (dm.dmBitsPerPel == 16 && dm.dmPelsWidth == w && dm.dmPelsHeight == h)
            break;
    }
    if (dm.dmPelsWidth != w || dm.dmPelsHeight != h) return FALSE; // 找不到

    dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
    LONG ret = ChangeDisplaySettings(&dm, CDS_FULLSCREEN);
    if (ret != DISP_CHANGE_SUCCESSFUL) {
        // 兼容 Win95 嘗試不指定刷新率
        dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
        ret = ChangeDisplaySettings(&dm, CDS_FULLSCREEN);
    }
    return ret == DISP_CHANGE_SUCCESSFUL;
}

關鍵細節

  • WS_CLIPCHILDREN | WS_CLIPSIBLINGS:防止子視窗/同層視窗繪製干擾 OpenGL 渲染區域。
  • CDS_FULLSCREEN:標記為全螢幕模式,系統不會重新排列桌面圖示。
  • 若啟動後底部有白線 (工作列露出),設定表單 FormStyle = fsStayOnTop 或呼叫 SetWindowPos(HWND_TOPMOST)。
  • 多顯示器環境下,EnumDisplaySettings(nullptr, ...) 僅影響主顯示器;需指定裝置名稱控制特定顯示器。

現代替代方案

BCB/VCL 年代久遠,新專案建議:

  • GLFW / SDL2:跨平台建立全螢幕 OpenGL/Vulkan Context,一行程式碼 glfwCreateWindow(w, h, title, glfwGetPrimaryMonitor(), nullptr)。
  • DirectX 11/12 SwapChain:SetFullscreenState(TRUE, nullptr)。
  • 若必須維護 BCB 專案,可整合 glew + freeglut 替換舊版 OpenGL 標頭。

結語

透過 WS_POPUP 移除視窗裝飾、ChangeDisplaySettings 切換解析度,即可在 BCB 中實現傳統全螢幕獨佔 OpenGL。雖然現代圖形 API 已轉向無邊框視窗 + 桌面解析度縮放 (Borderless Fullscreen),但理解此經典技術對維護舊專案、嵌入式系統仍具參考價值。

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