使用十六进制颜色值时,为什么TPanel的颜色属性显示错误的颜色?

时间:2011-10-04 18:52:03

标签: delphi

我正在使用Delphi 2010,如果我创建一个新的VCL应用程序,在表单上放一个TPanel并将其“color”属性设置为“clInactiveCaptionText”,它会显示正确的颜色。

正确的颜色:

enter image description here

但是,如果我输入此颜色的十六进制值($ 00434E54 --- R 67,G 78,B 84),则显示不正确。我应该注意,无论是否启用运行时主题,结果都是一样的。

颜色错误:

enter image description here

在指定其十六进制值时,为什么它不能正确显示此颜色?

5 个答案:

答案 0 :(得分:19)

RGB颜色值实际上指定为BGR。

所以,如果你想:

  • red你需要指定$ 000000FF
  • 绿色,您需要指定$ 0000FF00
  • 蓝色,您需要指定$ 00FF0000

答案 1 :(得分:17)

正如其他人所指出的那样,RGB值在内部存储为 BGR (即TColor值,或者Windows称为COLORREF),这就是为什么当你指定一个自定义颜色代码,您获得不同的颜色。

为了在RGB格式中指定颜色时保持理智,可以使用Windows单元中的 RGB()功能;它接受“自然”/直观RGB顺序(作为字节值)的参数,并产生适当的TColor / COLORREF值:

  MyPanel.Color := RGB(67, 78, 84);

或者如果十六进制更容易:

  MyPanel.Color := RGB($43, $4E, $54);

答案 2 :(得分:8)

这是因为您要设置RGB格式的TColor值,而必须使用BGR。

答案 3 :(得分:0)

实际上Tcolor是RGBA颜色格式,$FF000000也是alpha通道所以:

  • 要获得红色香奈儿,你可以获得$ 000000FF
  • 要获得绿色香奈儿,您可以获得$ 0000FF00
  • 要获得bluechanel,您可以获得$ 00FF0000
  • 要获得alpha chanel chanel,你可以获得$ FF000000

您可以轻松地将tcolor值转换为rgb:

IntToHex(ColorPanel1.Color,1) 

这也适用于跨平台的FMX delphi应用程序。

答案 4 :(得分:0)

function HexToColor(sColor : string) : TColor;
begin
   Result :=
     RGB(
       StrToInt('$'+Copy(sColor, 1, 2)),
       StrToInt('$'+Copy(sColor, 3, 2)),
       StrToInt('$'+Copy(sColor, 5, 2))
     ) ;
end;

使用这个简单的功能,您可以更轻松:

Panel1.Color := HexToColor ('16a086');