在開發跨平台或需適應不同顯示環境的 Delphi 應用程式時,偵測系統支援的色彩深度(位元數)是確保介面正確渲染的關鍵步驟。本文提供一個簡潔高效的函數,透過 Windows GDI API 取得螢幕裝置的色彩位元數,並換算為實際可顯示的色彩總數。
function GetSysColorNum: Integer;
var
ScreenDC: HDC;
NumBitsPixel: Integer;
begin
Result := 0;
// 取得螢幕裝置內容
ScreenDC := GetDC(0);
try
// 取得每像素位元數
NumBitsPixel := GetDeviceCaps(ScreenDC, BITSPIXEL);
// 計算色彩總數:2 的 N 次方
Result := 1 shl NumBitsPixel;
finally
// 釋放裝置內容
ReleaseDC(0, ScreenDC);
end;
end;
| API 函數 | 用途 |
|---|---|
GetDC(0) | 取得整個螢幕的裝置內容控制代碼 |
GetDeviceCaps(..., BITSPIXEL) | 查詢裝置每像素色彩位元數(如 4、8、16、24、32) |
ReleaseDC | 釋放裝置內容,避免 GDI 物件洩漏 |
| 位元數 | 色彩總數 | 典型應用場景 |
|---|---|---|
| 4 bits | 16 色 | 早期 VGA、安全模式 |
| 8 bits | 256 色 | 舊版遠端桌面、嵌入式裝置 |
| 16 bits | 65,536 色 | High Color、早期遊戲/多媒體 |
| 24 bits | 1,677 萬色 | True Color、標準桌面環境 |
| 32 bits | 42.9 億色(含 Alpha) | 現代作業系統、硬體加速渲染 |
procedure TForm1.AdjustUIForColorDepth;
var
ColorCount: Integer;
begin
ColorCount := GetSysColorNum;
if ColorCount <= 256 then
begin
// 低色彩環境:停用漸層、陰影、Alpha 混合
DisableVisualEffects;
UseSolidColorsOnly;
end
else if ColorCount <= 65536 then
begin
// 16-bit 環境:啟用基本漸層,避免複雜混合
EnableBasicGradients;
end
else
begin
// True Color 以上:完整視覺效果
EnableFullVisualEffects;
end;
end;
遠端桌面連線常降低色彩深度以節省頻寬,偵測到 8-bit 或 16-bit 時可自動切換至精簡介面模式。
程式啟動時記錄色彩深度,協助事後分析顯示異常問題。
GetDC(0) 回傳主螢幕 DC;若需特定螢幕資訊,請使用 EnumDisplayMonitors 配合 GetMonitorInfoGetDC 回傳值是否為 0透過 GetDeviceCaps(BITSPIXEL) 取得色彩位元數,再以位移運算 1 shl N 快速換算色彩總數,是 Delphi 開發者掌握顯示環境特性的基礎技能。結合自適應 UI 邏輯,能顯著提升應用程式在多樣化硬體環境下的相容性與使用者體驗。