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

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

Изменение цвета от #000000 до #FFFFFF с заданным шагом [D2005, 2000]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

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