Створення свого діалогу вибору кольору.

Сьогодні: -0 -0 -0

Зараз онлайн: На сайті -19 На IRC-каналі -2

Автор:Fobos (csportal.org.ru)

У цій статті я вирішив описати один варіант створення діалогу вибору кольору. Діалог вибору кольору, описаний у цій статті, трохи нагадує Photoshop-івський (але не зовсім). Для кращого порозуміння рекомендую спочатку скачати вихідник.

Загалом приступимо! Спочатку створюємо форму та поміщаємо туди все необхідне:

діалогу

7 компонентів типу TImage і назвемо їх так:

  • MainViewer – екран виведення градієнта;
  • ScalKontr – визначає присутність змінного компонента RGB кольору в градієнті (якщо вибраний R_GB - то червоного, якщо G_RB - то зеленого, якщо B_RG - то синього) від 0 до 255 шляхом натискання курсора на потрібну область.
  • Yarcost – шкала яскравості вибраного відтінку.
  • Proba 1 – для виду кольору під курсором при виборі насиченості компонентом ScalKontr.
  • Proba 2 – для виведення відтінку, що знаходиться під курсором при виборі результату та яскравості за допомогою MainViewer або Yarcost.
  • ImageZahvat – для виведення вибраної ScalKontr насиченості.
  • Itog – для виведення вибраного відтінку.

12 Edit-ів, 3 RadioButton та 2 кнопки . Їх дамо спокій (у сенсі не перейменовуємо).

Тепер нам необхідно визначитись із необхідними процедурами.

По-перше – це процедура генерування шкали розмаїття.

По-друге – це процедура генерування градієнта в MainViewer (відповідно до обраного типу градієнта та обраної насиченості).

По-третє – процедура генерування шкали яскравості,відповідно до вибраного відтінку.

Почнемо з першого. Сам наведений нижче код я помістив у обробникOnCreate форми.

var LineColor, ViewColor: TColor; ColR, ColG, ColB, i, j:integer; begin if RadioButton1.Checked then begin ColR:=255; ColG:=0; ColB: = 0; for j:=0 to 255 do begin LineColor:=RGB(255-j, 0, 0); //Змінюємо значення червоного кольору for i:=0 to 17 do ScalKontr.Canvas.Pixels[i, j]:=LineColor; //Малюємо точку end; end; if RadioButton2.Checked then begin ColR:=0; ColG: = 255; ColB: = 0; for j:=0 to 255 do begin LineColor:=RGB(0, 255-j, 0); //Змінюємо значення зеленого кольору for i:=0 to 17 do ScalKontr.Canvas.Pixels[i,j]:=LineColor; //Малюємо точку end; end; if RadioButton3.Checked then begin ColR:=0; ColG:=0; ColB: = 255; for j:=0 to 255 do begin LineColor:=RGB(0, 0, 255-j); //Змінюємо значення синього кольору for i:=0 to 17 do ScalKontr.Canvas.Pixels[i,j]:=LineColor; //Малюємо точку end; end; end;

Думаю, тут все зрозуміло. Далі приступимо до основної процедури малювання градієнта MainViewer. Ось код:

procedure GenerateRGBInOutGrad(ClrOutR, ClrOutG, ClrOutB: Integer); var i, j: Integer; //лічильники PixelColor: TColor; //Колір піксела Holst: TBitMap; //Об'єкт запису пікселів begin Holst:=TBitMap.Create; //Створюємо об'єкт типу TBitMap Holst.Width:=256; //Вказуємо ширини Holst.Height: = 256; //Вказуємо висоту if ClrDialog.RadioButton1.Checked then //якщо обрана RadioButton1 begin for j:=0 to 255 do //цикл по осі Y begin for i:=0 to 255 do //цикл по осі X begin PixelColor:= RGB(ClrOutR, j, i); Holst.Canvas.Pixels[i, j]:=PixelColor; //Малюємо точку end; end; end; if ClrDialog.RadioButton2.Checked=true then //якщо обрано RadioButton2 begin for j:=0 to 255 do //цикл по осі Y begin for i:=0 to 255 do //цикл по осі X begin PixelColor:=RGB( j,ClrOutG, i); Holst.Canvas.Pixels[i, j]:=PixelColor; //Малюємо точку end; end; end; if ClrDialog.RadioButton3.Checked=true then //якщо обрано RadioButton3 begin for j:=0 to 255 do //цикл по осі Y begin for i:=0 to 255 do //цикл по осі X begin PixelColor:=RGB( j, i, ClrOutB); Holst.Canvas.Pixels[i, j]:=PixelColor; //Малюємо точку end; end; end; ClrDialog.MainViewer.Canvas.Draw(0,0,Holst); //Малюємо всю картину на компонент TImage Holst.Free; //звільняємо пам'ять, яку займає об'єктом Holst end;

Ну і, нарешті, код виведення шкали яскравості:

Ось, у принципі, всі необхідні процедури для написання такого діалогу. Решта – справа техніки і це ви знайдете в прикладі до статті. Щоправда є ще один момент, який необхідно описати – це переклад із TColor у RGB формат. Чисто для прикладу зробимо 3 змінні типу integer (нехай це будуть ColR, ColG і ColB) та одну змінну типу TColor (Наприклад, ColTColor). Далі надамо значення змінної ColTColor. Нехай буде зелений (clGreen). Ну і, нарешті, виділимо із цієї змінної значення RGB компонентів у відповідні змінні типу integer. Весь код:

procedure TestTColorToRGB; var ColR, ColG, ColB: integer; ColTColor: TColor; begin ColTColor:=clGreen; //Привласнюємо зелений колір ColR:= ColTColor mod $100; //виділяємо червоний ColG:=( ColTColor div $100) mod $100; //виділяємо зелений ColB: = ColTColor div $10000; //виділяємо синій end;

У змінних мають бути такі значення:

ColR = 0; ColG = 255; ColB = 0.

Автор: Євген В