![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Изменение цвета от #000000 до #FFFFFF с заданным шагом [D2005, 2000]
azl © (2007-01-02 19:55:00)Зравствуйте, уважаемые мастера. С Новым Годом.
Подскажите, пожалуйста, как можно изменять цвет фона (цвет формы) в диапазоне от #000000 до #FFFFFF с заданным шагом?
Мне нужно выбрать цвет, задать шаг и по нажатию на кнопку менять цвет в зависимости от шага.
Как задавать этот шаг?
Спасибо.
vrem (2007-01-03 18:49:00) [1][22] azl © (03.01.07 18:33)
Добавь на пустую форму кнопку и вот её код
procedure TForm1.Button1Click(Sender: TObject);
type
colex = array[1..3] of extended;
procedure cveme(gde:extended; var bgr:colex);
var dr:extended;
begin //даёт цвет из спектра по номеру = gde
//gde=0..5.999 = 6 штук короче - по два на каждую часть спектра
gde:=gde-6*int(gde/6); //0 тоже считается
if gde<0 then gde:=gde+6; dr:=gde-int(gde); gde:=int(gde)+1;
if gde<=2 then begin if gde=1 then begin bgr[1]:=1; bgr[2]:=0; bgr[3]:=dr; exit; end;
bgr[1]:=1-dr; bgr[2]:=0; bgr[3]:=1; exit; end else
if gde<=4 then begin if gde=3 then begin bgr[1]:=0; bgr[2]:=dr; bgr[3]:=1; exit; end;
bgr[1]:=0; bgr[2]:=1; bgr[3]:=1-dr; exit; end else begin
if gde=5 then begin bgr[1]:=dr; bgr[2]:=1; bgr[3]:=0; exit; end;
bgr[1]:=1; bgr[2]:=1-dr; bgr[3]:=0; exit;
end;
end;
var i,j,k,m:integer; sp:colex;
de:extended;
begin
j:=256; //длина спектра
k:=255; //цветность
m:=50; //толщина спектра :)
for i := 1 to j do begin
cveme((6/j)*i,sp);
form1.Canvas.MoveTo(i,1);
form1.Canvas.Pen.Color:=
trunc(sp[1]*k)*65536+
trunc(sp[2]*k)*256+trunc(sp[3]*k);
form1.Canvas.LineTo(i,m);
end;
end;
azl (2007-01-03 18:33:00) [2]Eraser,
Вариант, спасибо. но не знаю, правильно ли это будет. Я сделал следующим образом:
procedure TForm1.TrackBar1Change(Sender: TObject);
begin
TrackBar1.Position;
Color := rgb(Color,TrackBar1.Position,Color);
Caption := ColorToString(Color);
end;
TrackBar взял для пробы, чтобы кнопку не тыкать постоянно.
Zeqfreed (gentoo) (2007-01-03 17:56:00) [3]Aha. Use HSL model and be happy. Sorry for english.
Eraser (2007-01-03 17:51:00) [4]> [19] azl © (03.01.07 17:35)
> - Кнопка, которая будет изменять выбранный цвет с введенным
> шагом;
сделай изменение нажатием кнопки только одного из каналов цвета, и соответственно сам выбор канала цвета сделай при помощи тех же radio buttons. И будет тебе счастье )
azl (2007-01-03 17:35:00) [5]Да я бы с удовольствием, но дали мне задачку вот какую:
Написать программу, которая бы выводила на требуемом фоне, введенный с клавиатуры текст, заданного цвета.
Предусмотреть:
- Задание начального цвета текста и фона (От #000000 до #FFFFFF);
- Выбор изменяемого цвета (Будем изменять цвет фона или текста);
- Выбор шрифта для текста, поле для введения текста;
- Шаг изменения цвета;
- Кнопка, которая будет изменять выбранный цвет с введенным шагом;
Кнопка вывода текущего цвета текста и шага.
Одним словом - дурдом.
Tifon (2007-01-03 17:20:00) [6]А почему бы не задавать цвет просто через RGB с помощью таймер, например в таймере наращивая 3 переменных изменять цвет или одну или две и такой подборкой подобрать себе нужные цвета?
azl (2007-01-03 17:12:00) [7]vrem, я попытался с ней работать, у меня чего-то не получилось. Если тебя не затруднит, приведи, пожалуйста, пример использования.
vrem (2007-01-03 17:01:00) [8]azl, а моя процедура чем не хороша?
azl (2007-01-03 16:49:00) [9]Tirael,
Дело в том, что при iStep = 1 больше всего разных цветов появляется. Если, например, iStep := 100, то появляется только черный цвет и больше не меняется.
Tirael (2007-01-03 15:07:00) [10]
> azl © (02.01.07 20:32) [5]
>
> Eraser, спасибо. Только вот что-то не совсем правильно получается.
> присваиваю iStep := 1; При этом ни зеленый, ни красный
> цета не появляются. Или это так и дожно быть?
ты крут! при iStep=1 чтоб всю палитру пройти нужно 16777215 раз баттон надавить )
Германн (2007-01-03 14:29:00) [11]
> azl © (03.01.07 12:12) [12]
>
> Германн ©
>
> > Ещё один повод вспомнить RxLib :-)
>
> А с этого момента поподробнее, пожалуйста.
>
Смотри в RxLib:
{ Gradient fill procedure - displays a gradient beginning with a chosen }
{ color and ending with another chosen color. Based on TGradientFill }
{ component source code written by Curtis White, cwhite@teleport.com. }
procedure GradientFillRect(Canvas: TCanvas; ARect: TRect; StartColor,
EndColor: TColor; Direction: TFillDirection; Colors: Byte);
azl (2007-01-03 12:12:00) [12]Германн ©
> Ещё один повод вспомнить RxLib :-)
А с этого момента поподробнее, пожалуйста.
Германн (2007-01-03 01:21:00) [13]Ещё один повод вспомнить RxLib :-)
Eraser (2007-01-02 21:21:00) [14]лучше подобные "игры" с цветом реализовывать через RGB представление... так понятнее будет.
Eraser (2007-01-02 21:20:00) [15]> [8] azl © (02.01.07 21:02)
появляются, просто ты не успеваешь их заметить :)
azl (2007-01-02 21:02:00) [16]Может. Пишу вот так:
procedure TForm1.Button1Click(Sender: TObject);
var
iStep: Integer;
begin
iStep := 1;
if Color + iStep < $FFFFFF then
Color := Color + iStep
else
Color := 0;
end;
Красный и зеленый цвет не появляется.
Anatoly Podgoretsky (2007-01-02 20:45:00) [17]> azl (02.01.2007 20:32:05) [5]
Не может этого быть
Anatoly Podgoretsky (2007-01-02 20:44:00) [18]> vrem (02.01.2007 20:02:02) [2]
Потом будет позеленение и так далее.
azl (2007-01-02 20:32:00) [19]Eraser, спасибо. Только вот что-то не совсем правильно получается. присваиваю iStep := 1; При этом ни зеленый, ни красный цета не появляются. Или это так и дожно быть?
vrem (2007-01-02 20:21:00) [20]Давнишний исходник нашёл:
Процедура позволяет обойти все цвета спектра плавно,
для этого процедуре нужно давать числа плавно изменяющиеся от 0 и до 6,
на выходе получаем
нечто вида [b,g,r] = [0,0.3333,1]
умножаем на "цветность", например на 255, округляем и получаем -
[0,85,255] - некий цвет.
с фотошопом совпадает :)
type
colex = array[1..3] of extended;
procedure cveme(gde:extended; var bgr:colex);
var dr:extended;
begin //даёт цвет из спектра по номеру = gde
//gde=0..5.999 = 6 штук короче - по два на каждую часть спектра
gde:=gde-6*int(gde/6); //0 тоже считается
if gde<0 then gde:=gde+6; dr:=gde-int(gde); gde:=int(gde)+1;
if gde<=2 then begin if gde=1 then begin bgr[1]:=1; bgr[2]:=0; bgr[3]:=dr; exit; end;
bgr[1]:=1-dr; bgr[2]:=0; bgr[3]:=1; exit; end else
if gde<=4 then begin if gde=3 then begin bgr[1]:=0; bgr[2]:=dr; bgr[3]:=1; exit; end;
bgr[1]:=0; bgr[2]:=1; bgr[3]:=1-dr; exit; end else begin
if gde=5 then begin bgr[1]:=dr; bgr[2]:=1; bgr[3]:=0; exit; end;
bgr[1]:=1; bgr[2]:=1-dr; bgr[3]:=0; exit;
end;
end;