在 C++ Builder (BCB) 中實現全螢幕獨佔模式 OpenGL 渲染,核心在於兩步:移除視窗邊框/標題列 (WS_POPUP) 與 切換顯示器解析度匹配視窗大小。本文提供完整 TForm 覆寫 CreateParams 範例與解析度切換工具函數。
CreateParams 設定 WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS。CreateParams 中呼叫 ChangeResolution(800, 600) 切換解析度。Params.Width/Height = 800/600、Params.X = Params.Y = 0 覆蓋全螢幕。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 年代久遠,新專案建議:
glfwCreateWindow(w, h, title, glfwGetPrimaryMonitor(), nullptr)。SetFullscreenState(TRUE, nullptr)。glew + freeglut 替換舊版 OpenGL 標頭。透過 WS_POPUP 移除視窗裝飾、ChangeDisplaySettings 切換解析度,即可在 BCB 中實現傳統全螢幕獨佔 OpenGL。雖然現代圖形 API 已轉向無邊框視窗 + 桌面解析度縮放 (Borderless Fullscreen),但理解此經典技術對維護舊專案、嵌入式系統仍具參考價值。