Ответ Дэвида, как правило, работает очень хорошо.Но есть несколько вариантов, и я упомяну некоторые из них.Во-первых, самый наивный подход - сделать
function InvertColor(const Color: TColor): TColor;
begin
result := TColor(Windows.RGB(255 - GetRValue(Color),
255 - GetGValue(Color),
255 - GetBValue(Color)));
end;
, но это страдает от проблемы # 808080 (почему?).Очень хорошим решением является решение Дэвида, но оно выглядит очень плохо для некоторых неудачных цветов фона.Хотя текст, безусловно, виден, он выглядит ужасно.Один из таких «неудачных» цветов фона - # 008080.
Обычно я предпочитаю, чтобы текст был черным, если фон «светлый», и белым, если фон «темный».Поэтому я делаю
function InvertColor(const Color: TColor): TColor;
begin
if (GetRValue(Color) + GetGValue(Color) + GetBValue(Color)) > 384 then
result := clBlack
else
result := clWhite;
end;
Кроме того, если вы используете Delphi 2009+ и ориентированы на Windows Vista +, вас может заинтересовать параметр GlowSize
в TLabel
.
.