#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. Спасибо Андреасу и Уве за ответ на вопрос 😉