![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Формула инверсия цвета
Ega23 © (2005-01-12 13:45:00)Несколько необычный вопрос. Имеется следующая проблема - раскрашиваю TRxDBGrid. В запросе из базы летит строка, типа: FCL:255,FSZ:10,FST:0,BCL:65280,
где FCL - FontColor, FSZ - FontSize, FST - FontStyle, BCL - BackgroundColor.
Так вот. Вся проблема в том, что как только я меняю бэкграунд с белого на любой другой цвет - пропадает Highlight. Нужно его восстановить. Поскольку clHighlight - чистая константа, изменить цвет выделения можно только изменив цвет бэкграунда.
Самый простой вариант -
if Highlight then
begin
Background:=clHighlight;
AFont.Color:=clHighlightText;
end;
но это не совсем красиво. Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).
Собственно вопрос: существует ли формула инверсии цвета? Т.е., к примеру, цвет фона синий - меняем по этой формуле местами биты - получаем чвет выделения на синем - жёлтый.
boriskb (2005-01-12 14:04:00) [41]Ega23 © (12.01.05 14:01) [12]
Самое поганое, что заказчик хочет красить данные на свой вкус, иначе забил бы в базу 2 десятка цветов + контрастные к ним.
Он что - дальтоник? Он настаивает что цвет может быть абсолютно любым из 32 бит?
Тогда работать сним, убеждать.
IMHO если у него такое странное цветовосприятие - что бы ты не выдумал, он будет придираться.
Anatoly Podgoretsky (2005-01-12 14:03:00) [42]pasha_golub © (12.01.05 14:02) [14]
Мысль двигается одинаково
pasha_golub (2005-01-12 14:02:00) [43]В таком слуае есть предложение, не просто xor делать. А потом "округлять" (приводить) к ближайшему "грубому" цвету из заранее подготовленной палитры.
Anatoly Podgoretsky (2005-01-12 14:02:00) [44]Ega23 © (12.01.05 13:59) [11]
Не надо путать системную палитру и свойство Highloght
Для твоего случая я бы посоветовал замену по сокращенной таблицы цветов. Какой цвет подставлять подобрать экспериментально исходя из сообственных предпочтений.
Ega23 (2005-01-12 14:01:00) [45]Нет, смотри [8], результат будет $808080, что по сути равно $7F7F7F
Вот и я о том же. Самое поганое, что заказчик хочет красить данные на свой вкус, иначе забил бы в базу 2 десятка цветов + контрастные к ним.
Ega23 (2005-01-12 13:59:00) [46]цвет выделения не обязательно clBlue.
Цвет выделения описан в Graphics.pas и представляет собой
const
clHighlight = TColor(COLOR_HIGHLIGHT or $80000000);
clHighlightText = TColor(COLOR_HIGHLIGHTTEXT or $80000000);
где COLOR_HIGHLIGHT и COLOR_HIGHLIGHTTEXT - цвета элементов текущей цветовой схемы Windows.
Anatoly Podgoretsky (2005-01-12 13:57:00) [47]Ega23 © (12.01.05 13:53) [5]
Нет, смотри [8], результат будет $808080, что по сути равно $7F7F7F
wal (2005-01-12 13:57:00) [48]>Вот и хотелось посоветоваться - xor на всех цветах нормальные сочетания даёт?
Нет.
10000000 xor 11111111 = 01111111,
а у 10000000 и 01111111 разница совсем не велика, на глаз не заметишь.
С уважением.
Anatoly Podgoretsky (2005-01-12 13:56:00) [49]TUser © (12.01.05 13:50) [2]
цвет выделения не обязательно clBlue. Теперь представь $FFFFFF и фон $7F7F7F
pasha_golub (2005-01-12 13:54:00) [50]Ega23 © (12.01.05 13:53) [5]
Лучше всего на черно-белой паре xor работает. :)
Есть такая фишка, есть... Токо вот где?
Ega23 (2005-01-12 13:54:00) [51]Это не инверсия, а контрастные цвета и/или совместимые цвета,
Ну я это и имел ввиду.
Ega23 (2005-01-12 13:53:00) [52]Ну, xor тоже первое, что пришло мне в голову. Проблема в том, что в сочетаниях цветов я разбираюсь как свинья в апельсинах. Вот и хотелось посоветоваться - xor на всех цветах нормальные сочетания даёт?
Игорь Шевченко (2005-01-12 13:52:00) [53]
> существует ли формула инверсии цвета?
Самый примитивный способ - инвертировать все биты цвета :) Серый останется серым, но в ряде случаев достаточно.
С уважением,
Anatoly Podgoretsky (2005-01-12 13:52:00) [54]Это не инверсия, а контрастные цвета и/или совместимые цвета, а сама формула инверсии следующая - Color := Color XPR $FFFFFF, но результат по контрастности будет плохой.
TUser (2005-01-12 13:50:00) [55]Я, когда грид красил, то писал в DrawCell
if CanFill then
with Self.Canvas do begin
if (gdSelected in AState) and (not (gdFocused in AState)) then
Brush.Color:=Color xor clBlue
else Brush.Color:=Color;
Здесь clBlue - цвет выделения.
pasha_golub (2005-01-12 13:49:00) [56]xor?