Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Формула инверсия цвета


Страницы:   1 2 3

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 соответственно).
Исходный цвет - точка в этом кубе.
И наиболее отличающийся цвет ищем как наиболее удаленную точку на этом кубе?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо