Delphi 为什么TPanel';s颜色属性在使用十六进制颜色值时显示错误的颜色?

Delphi 为什么TPanel';s颜色属性在使用十六进制颜色值时显示错误的颜色?,delphi,Delphi,我使用的是Delphi 2010,如果我创建了一个新的VCL应用程序,在表单上放置一个TPanel,并将其“color”属性设置为“clInactiveCaptionText”,它将显示正确的颜色 正确的颜色: 但是,如果我为这个颜色输入十六进制值($00434E54---R67,G78,B84),它会错误地显示出来。我应该注意,无论是否启用运行时主题,结果都是一样的 颜色错误: 知道为什么在指定十六进制值时不能正确显示此颜色吗?RGB颜色值实际上被指定为BGR 因此,如果你想: 红色您需

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

正确的颜色:

但是,如果我为这个颜色输入十六进制值($00434E54---R67,G78,B84),它会错误地显示出来。我应该注意,无论是否启用运行时主题,结果都是一样的

颜色错误:


知道为什么在指定十六进制值时不能正确显示此颜色吗?

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

因此,如果你想:

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

这是因为您设置的是RGB格式的值,您必须改用BGR。

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

要在RGB表单中指定颜色时保持理智,可以使用Windows单元中的RGB()函数;这将以“自然的”/“直观的RGB顺序”(作为字节值)接受参数,并生成适当的
TColor
/
COLORREF
值:

  MyPanel.Color := RGB(67, 78, 84);
或者如果hex更容易:

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

实际上,Tcolor是RGBA颜色格式,并且
$FF000000
是alpha通道,因此:

  • 要得到红色香奈儿,你可以得到$000000FF
  • 要获得绿色香奈儿,您可以获得$0000FF00
  • 要获得bluechanel,您可以获得$00FF0000
  • 要获得阿尔法香奈儿香奈儿,您可以获得FF000000美元
您可以通过以下方式轻松地将tcolor值转换为rgb:

IntToHex(ColorPanel1.Color,1) 
这也适用于跨平台FMX delphi应用程序

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');

非常感谢。按照您的指示,我将颜色更改为$00544E43,并且它的工作方式与应有的一样。+1表示注意事项。我记得我第一次遇到这件事的时候就发疯了。