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-13 10:33:00) [1]

Мужики, всю ночь не спал, одну штуку вспомнил. Если цвет системный, например, clHighlight, то у него представление отличное от формата RGB. Короче, в старшем байте стоит $80, что говорит о его системности, а в младшем значение типа byte. Короче, цвет clHighlight на самом деле будет представлен как: $8000000D.

Шобы это дело победить, нужно внутри процедуры поставить таку штуку:


...
AColor := ColorToRGB(AColor);
...


TButton   (2005-01-12 22:34:00) [2]

вот тебе апельсин =)
http://www.webwhirlers.com/colors/wizard.asp


Alx2   (2005-01-12 22:04:00) [3]

Тромознул с первым вариантом.
Так гораздо короче, быстрее и понятнее:

function GetDColor(const aColor: TColor): TColor;
Type TRec=
   packed record
   r, g, b, dummy: byte
 end;
begin
 Result := aColor;
 with TRec((@Result)^) do
 begin
   if r > 127 then r := 0 else r := 255;
   if g > 127 then g := 0 else g := 255;
   if b > 127 then b := 0 else b := 255;
 end;
end;


BiN   (2005-01-12 16:33:00) [4]

А не проще ли заставить этого дотошного клиента самому цвет подсветки настраивать.


Alx2   (2005-01-12 16:32:00) [5]

>pasha_golub ©   (12.01.05 16:17) [51]
Их так не хватало? :)


pasha_golub   (2005-01-12 16:17:00) [6]

Alx2 ©   (12.01.05 16:13) [50]
Ага, а мне без комментариев кидал... ;-)


Alx2   (2005-01-12 16:13:00) [7]

Раз уж написал, то не выкидывать же. :)
Вот моя идея:

Procedure TForm1.Button3Click(Sender: TObject);
Var
 Templates: Array[0..7] Of TColor;

 Function GetDistanceColor(aColor: TColor): TColor; // Ищем "самый далекий" цвет
 Var
   k, dist, maxdist, best: Integer;
 Begin
   best := 0;
   maxdist := GetRValue(aColor) + GetGValue(aColor) + getBValue(aColor);
   For k := 1 To 7 Do
     Begin
       dist := abs(GetRValue(aColor) - GetRValue(Templates[k])) +
         abs(GetGValue(aColor) - GetGValue(Templates[k])) +
         abs(GetBValue(aColor) - GetBValue(Templates[k]));
       If dist > maxdist Then
         Begin
           maxdist := dist;
           best := k;
         End;
     End;
   Result := Templates[best];
 End;
Var
 k1, k2, k3, c: Integer;
Begin
// Сначала заполним вершины куба
 c := 0;
 For k1 := 0 To 1 Do
   For k2 := 0 To 1 Do
     For k3 := 0 To 1 Do
       Begin
         Templates[c] := rgb(255 * k1, 255 * k2, 255 * k3);
         inc(c);
       End;

 If ColorDialog1.Execute Then
   Begin
     Color := ColorDialog1.Color;
     Label1.Caption := IntToStr(Color);
     Label1.Font.Color := GetDistanceColor(ColorDialog1.Color);
   End;
End;


Ega23   (2005-01-12 15:32:00) [8]

2 MBo ©   (12.01.05 14:59) [45]
Интересное решение. Спасибо.


MBo   (2005-01-12 15:19:00) [9]

>Alx2 ©   (12.01.05 15:10) [47]
не очень симпатичный, конечно, но все же достаточно контрастный.


Alx2   (2005-01-12 15:10:00) [10]

>MBo ©   (12.01.05 14:59)
для цвета aColor = 10254470 результат неважный :(


pasha_golub   (2005-01-12 15:05:00) [11]

wicked ©   (12.01.05 14:43) [39]
а поскольку мне медведь не только на ухо наступил, но и в глаз плюнул,

LOL


MBo   (2005-01-12 14:59:00) [12]

в большинстве случаев приемлемо:

function ContrastColor(AColor: TColor): TColor;
const
 TolerSq = 16 * 16;
begin
 if Sqr(GetRValue(AColor) - $80) + Sqr(GetGValue(AColor) - $80)
   + Sqr(GetBValue(AColor) - $80) < TolerSq then
   Result := (AColor + $7F7F7F) and $FFFFFF
 else
   Result := AColor xor $FFFFFF;
end;


Ega23   (2005-01-12 14:55:00) [13]

Ограниченый набор цветов и предпрсмотр сразу в том же диалоге, хороший пример настройка редактора Дельфи.

Ну это так и сделано. Щстановился на том, что в этом диалоге настройки добавил задание цвета выделения, которое по-умолчанию поставил xor $808080


boriskb   (2005-01-12 14:55:00) [14]

Anatoly Podgoretsky ©   (12.01.05 14:52) [42]

А тема "Как слушать заказчика и что из его требований выполнять, а с чем спорить" - вообще... говорить можно бесконечно :)


Anatoly Podgoretsky   (2005-01-12 14:52:00) [15]

boriskb ©   (12.01.05 14:35) [35]
Ограниченый набор цветов и предпрсмотр сразу в том же диалоге, хороший пример настройка редактора Дельфи.


Ega23   (2005-01-12 14:50:00) [16]

В общем Background := Background xor $808080  оказалось неплохой идеей. Цвета более-менее сочетаются.
Покажу заказчику возможные проблемы, пусть сам думае...

Всем большое спасибо.


Ega23   (2005-01-12 14:48:00) [17]

насчет RGB и HLS - начиная с delphi 6 (предполагаю, у меня cbuilder 6) есть модуль graphutil... советую глянуть...

В конторе Delphi 5 до сих пор как основной инструмент разработки принят...  :-(


wicked   (2005-01-12 14:43:00) [18]

> pasha_golub ©   (12.01.05 14:38) [36]
ну почему же... когда я работал в "большой-конторе", то видел, как многие продвинутые бухгалтера настраивали цвета под себя... жить без того им было скучно...
а поскольку мне медведь не только на ухо наступил, но и в глаз плюнул, то самое лучшее - использовать системные цвета windows... тогда в моих аппликациях и цвета подобраны, и юзер доволен...


boriskb   (2005-01-12 14:39:00) [19]

pasha_golub ©   (12.01.05 14:38) [36]
вообще юзеру надо обрубить возможность цвет настраивать - пущай об работе думаит


:) :) Ну, типа того.


wicked   (2005-01-12 14:38:00) [20]

насчет RGB и HLS - начиная с delphi 6 (предполагаю, у меня cbuilder 6) есть модуль graphutil... советую глянуть...

> Ega23 ©   (12.01.05 14:31) [33]
не хоцца, ибо выделение - это участок шкалы, на которой могут быть метки с текстом, рисунки и прочая... лучший способ, который я придумал - это как раз инвертировать выделенную область... а метки как рисовались, так и рисуются....
видать таки вернусь к инвертированию - фон серый на сером и так неплох... ;)


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

Наверх

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