【发布时间】:2020-06-08 13:22:01
【问题描述】:
希望是一个简单的问题,但我找不到答案。我正在使用 Delphi TColor 并且某些颜色值为负值。这有记录吗?我需要做一些颜色转换,例如到 RGB。
例如:Label.Color=-16777188; //淡蓝色
谢谢
【问题讨论】:
希望是一个简单的问题,但我找不到答案。我正在使用 Delphi TColor 并且某些颜色值为负值。这有记录吗?我需要做一些颜色转换,例如到 RGB。
例如:Label.Color=-16777188; //淡蓝色
谢谢
【问题讨论】:
负值不是实际的 RGB 颜色,而是 Windows 系统颜色,它是可变的。
例如,以下是实际的 RGB 颜色:
clRed = $000000FF; {00BBGGRR}
clBlue = $00FF0000;
clWhite = $00FFFFFF;
clBlack = $00000000;
这里有一些系统颜色:
clWindow = $FF000005;
clWindowText = $FF000008;
clHighlight = $FF00000D;
clActiveCaption = $FF000002;
这些不是实际的 RGB 值,而是代表您的系统颜色。通常,clWindow 是白色的,clWindowText 是黑色的,clHighlight 是某种蓝色等等,但是——同样——这些设置可以在 Windows 中更改。
当这些 32 位整数被解释为 有符号 32 位整数时,它们变为负数。这就是你所看到的:
clWindow = -16777211;
clWindowText = -16777208;
clHighlight = -16777203;
clActiveCaption = -16777214;
因此,在您的情况下,-16777188 不能保证是“浅蓝色”。在十六进制中,此值为$FF00001C,我将其识别为clGradientInactiveCaption,即非活动非主题(Windows 9x 样式)窗口标题栏的第二个渐变颜色。
如您所知,在 VCL 中,您可以像使用实际颜色一样使用这些系统颜色。但是——当然——你得到的实际颜色可能因用户而异。
您可以使用ColorToRGB 函数从此类系统颜色中获取实际的RGB 颜色。在我的系统上,ColorToRGB(clGradientInactiveCaption) 产生 $00F2E4D7(确实是浅蓝色)。
【讨论】:
Windows.RGB()函数,不要直接使用数值
Delphi 定义的 Windows 系统颜色如
SysGradientInactiveCaption = TColor(SystemColor or cGRADIENTINACTIVECAPTION);
与
SystemColor = $FF000000;
和
cGRADIENTINACTIVECAPTION = 28;
这最终为 -16777188。
这些常量可以在TColorRec下的System.UITypes.pas中找到。
【讨论】: