![]() |
| ||
|
|
Новости |
Поиск |
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-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]
не хоцца, ибо выделение - это участок шкалы, на которой могут быть метки с текстом, рисунки и прочая... лучший способ, который я придумал - это как раз инвертировать выделенную область... а метки как рисовались, так и рисуются....
видать таки вернусь к инвертированию - фон серый на сером и так неплох... ;)