![]() |
| ||
|
|
Новости |
Поиск |
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;
но это не совсем красиво. Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).
Собственно вопрос: существует ли формула инверсии цвета? Т.е., к примеру, цвет фона синий - меняем по этой формуле местами биты - получаем чвет выделения на синем - жёлтый.
pasha_golub (2005-01-12 14:38:00) [21]boriskb © (12.01.05 14:35) [35]
Ну, дык, за то интересно ведь. А вообще юзеру надо обрубить возможность цвет настраивать - пущай об работе думаит. Бугагага
boriskb (2005-01-12 14:35:00) [22]Ega23 ©
Не знаю, мне кажется, что задача которую ты решаешь имеет чисто академический интерес. А практически будет так: пользователь все равно составит себе табличку и будет из нее выбирать. Ну не будет он всеми возможными цветами пользоваться, согласись?
Лучше подумать как ему эту табличку удобней предоставить.
TUser (2005-01-12 14:32:00) [23]
> xor на всех цветах нормальные сочетания даёт?
Меня [2] удвлетворил. Потом работал с этим компонентом, используя много разных цветов - всегда получалось неплохо.
Ega23 (2005-01-12 14:31:00) [24]2 wicked © (12.01.05 14:30) [32]
А ты Font.Color точно так же меняй...
wicked (2005-01-12 14:30:00) [25]хм... попробовал на реальном проекте C := C xor $808080... всё хорошо (нет серого на сером), но на выделенном участке не видно черный текст на белом фоне....
пробуем дальше....
Alx2 (2005-01-12 14:29:00) [26]>Ega23 © (12.01.05 14:28) [30]
А я предлагаю сначала на RGB попробовать :)
Ega23 (2005-01-12 14:28:00) [27]Предлагаю, для начала перейти от палитры RGB к палитре HSB
У тебя под рукой формулы нет? У меня где-то валялась, но, чую, замучаюсь её искать... :-(
Ega23 (2005-01-12 14:27:00) [28]Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).
А, это в том случае, если цветовая палитра Windows - стандартная и я ничего не меняю, if Highlight...
pasha_golub (2005-01-12 14:27:00) [29]Значит в развитие идеи Алекса.
Предлагаю, для начала перейти от палитры RGB к палитре HSB (hue;saturation;brightness). А вот уже на ней использовать алгоритм Алекса. По моему скромному, в таком случае мы предотвратим возможность появления красного текста на зеленом фоне, брр-р-р
Anatoly Podgoretsky (2005-01-12 14:19:00) [30]Ega23 © (12.01.05 14:16) [25]
А как же насчет
Допустим, цвет фона сам по себе синий. Тогда этой подсветки не будет видно. Или он, какой-нибудь красный, с которым синий не сочетается (это к примеру, чувство цвета у меня напроч отсутствует).
Anatoly Podgoretsky (2005-01-12 14:18:00) [31]Семен Сорокин © (12.01.05 14:15) [24]
Это аналитическая реализация булевой функции XOR
Ega23 (2005-01-12 14:16:00) [32]советую обратить внимание на
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1104759069&n=5
C := C xor $808080 ?
Сейчас попробую...
2 Alx2 © (12.01.05 14:05) [17]
Интересная идея... Т.е. всего 8 цветов...
Семен Сорокин (2005-01-12 14:15:00) [33]вставлю свои 5 копеек :)
а я в свое время вот этим пользовался:
function InvertColor(AColor: TColor): TColor;
begin
Result := RGB(255 - GetRValue(ColorToRGB(AColor)),
255 - GetGValue(ColorToRGB(AColor)),
255 - GetBValue(ColorToRGB(AColor)))
end;
Ega23 (2005-01-12 14:11:00) [34]Не надо путать системную палитру и свойство Highloght
Да я их не путаю, просто в дебрях исходников рисования CustomDBGrid'а наткнулся на
if Higlight then
begin
Brush.Color:=clHighlight;
Font.Color:=clHighlightText;
Т.е. общей формулы, насколько я понимаю, нету?
В принципе, можно дать пользователю возможность настройки цыета выделения, это не проблема...
pasha_golub (2005-01-12 14:11:00) [35]Alx2 © (12.01.05 14:07) [19]
Ого, у тебя идеи. Прикольно, блин.
wicked (2005-01-12 14:09:00) [36]советую обратить внимание на
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1104759069&n=5
особенно постинг от Asteroid (идея мне понравилась...)
Alx2 (2005-01-12 14:09:00) [37]>Anatoly Podgoretsky © (12.01.05 14:06)
То есть речь идет еще и о приятном цветосочетании?
Alx2 (2005-01-12 14:07:00) [38]>Alx2 © (12.01.05 14:05) [17]
Вдогонку:
Такая точка будет находиться в вершинах куба. Их всего 8.
Поэтому достаточно перебрать вершины и остановиться на наиболее удаленной
Anatoly Podgoretsky (2005-01-12 14:06:00) [39]Alx2 © (12.01.05 14:05) [17]
Это удаленная а не совместимая точка, кроме решения по таблице все остальные будут неудовлетворительны. А если таблицу держать в базе, то можно позволить ее и настраивать по вкусу.
Alx2 (2005-01-12 14:05:00) [40]>Ega23 © (12.01.05 14:01)
А если попробовать сделать что-то такое:
Имеем цветовой куб (по осям R,G,B соответственно).
Исходный цвет - точка в этом кубе.
И наиболее отличающийся цвет ищем как наиболее удаленную точку на этом кубе?