Отрицательный формат delphi TColor

#delphi #colors #vcl

#delphi #tcolor

Вопрос:

надеюсь, простой вопрос, но я не смог найти ответ. Я использую Delphi TColor, и некоторые значения цвета отрицательны. Это задокументировано? Мне нужно выполнить некоторые преобразования цвета, например, в RGB.

например: Метка.Color=-16777188; // светло-голубоватый

Спасибо

Ответ №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 вы можете использовать эти системные цвета, как если бы они были реальными цветами. Но, конечно, фактические цвета, которые вы получаете, могут отличаться от пользователя к пользователю.

Вы можете получить фактический цвет RGB из такого системного цвета с помощью ColorToRGB функции. В моей системе ColorToRGB(clGradientInactiveCaption) выдает $00F2E4D7 результат (действительно светло-голубоватый).

Комментарии:

1. Чтобы добавить к этому, когда вы хотите указать конкретное значение RGB, а не системный цвет, вы должны использовать Windows.RGB() функцию, не используйте числовые значения напрямую

2. Как они сказали (я хочу отметить), имейте в виду, что у каждого пользователя может быть другой цвет при использовании системных цветов, чего, вероятно, вы хотите избежать.

Ответ №2:

Delphi определяет системные цвета Windows, такие как

 SysGradientInactiveCaption = TColor(SystemColor or cGRADIENTINACTIVECAPTION);
  

С

 SystemColor = $FF000000;
  

и

 cGRADIENTINACTIVECAPTION = 28;
  

в итоге получается -16777188.

Эти константы можно найти в System.UITypes.pas под TColorRec .

Комментарии:

1. Спасибо Андреасу и Уве за ответ на вопрос 😉