如何获取系统颜色的 RGB 值?

How to get RGB values for a system color?

我一直使用 GetRValueGetGValueGetBValue 函数(来自 Winapi.Windows 单元)来提取 TColor 的 RGB 值。

不幸的是,同样的方法似乎并不适用于 system colors,例如 clWindowclBtnFace 等等。

例如:

var
  MyColor : TColor;
begin
  MyColor := clBtnFace;

  ShowMessage(
    'R = ' + IntToStr(GetRValue(MyColor)) + sLineBreak +
    'G = ' + IntToStr(GetGValue(MyColor)) + sLineBreak +
    'B = ' + IntToStr(GetBValue(MyColor))
  );
end;

它产生以下输出:

R = 15

G = 0

B = 0

应该如下所示:

在我的系统上,我看到的是以下颜色:

使用Get(R|G|B)Value()可以很好地处理系统颜色,您只需要先将它们转换为RGB。为此使用 ColorToRGB() 函数:

Converts a TColor value into an RGB representation of the color.

例如:

var
  MyColor: TColor;
  RGB: Longint;
begin
  MyColor := ...; // any valid TColor value, whether RGB or system constant...
  RGB := ColorToRGB(MyColor);

  ShowMessage(
    'R = ' + IntToStr(GetRValue(RGB)) + sLineBreak +
    'G = ' + IntToStr(GetGValue(RGB)) + sLineBreak +
    'B = ' + IntToStr(GetBValue(RGB))
  );
end;