【问题标题】:delphi TColor format Negativedelphi TColor 格式 负片
【发布时间】:2020-06-08 13:22:01
【问题描述】:

希望是一个简单的问题,但我找不到答案。我正在使用 Delphi TColor 并且某些颜色值为负值。这有记录吗?我需要做一些颜色转换,例如到 RGB。

例如:Label.Color=-16777188; //淡蓝色

谢谢

【问题讨论】:

    标签: delphi tcolor


    【解决方案1】:

    负值不是实际的 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(确实是浅蓝色)。

    【讨论】:

    • 补充一点,当你想指定一个特定的RGB值而不是系统颜色时,你应该使用Windows.RGB()函数,不要直接使用数值
    • 正如他们所说(我想说),请记住,每个用户在使用系统颜色时可能会有不同的颜色,这可能是您要避免的行为。
    【解决方案2】:

    Delphi 定义的 Windows 系统颜色如

    SysGradientInactiveCaption = TColor(SystemColor or cGRADIENTINACTIVECAPTION);
    

    SystemColor = $FF000000;
    

    cGRADIENTINACTIVECAPTION = 28;
    

    这最终为 -16777188。

    这些常量可以在TColorRec下的System.UITypes.pas中找到。

    【讨论】:

    • 感谢 Andreas 和 Uwe 回答问题 ;)
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2011-09-17
    • 2012-04-28
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多