Работа с цветом в Delphi

В играх и графических пакетах этому байту нашли применение. Он часто ука­зывает прозрачность, но в офисных приложениях его просто игнорируют.

 

Как вы уже знаете, один байт может принимать значения от 0 до 255 (в десятич­ной форме) или от 0 до FF (в шестнадцатеричной). Так что в шестнадцатеричной форме цвет будет выглядеть как SOOFFFFFF. Только тут сразу надо отметить, что первые два нуля — это лишний байт, потом идут FF для голубого цвета, затем FF для зеленого и последние FF для красного. Получается, что в памяти цвет хранится как BGR (в обратном порядке). Абсолютно красный цвет будет равен $000000FF, абсолютно зеленый — $0000FF00, а голубой — S00FF0000.

 

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

Итак, на форме три компонента TEdit. Для красного цвета компонент назовите RedEdit, ДЛЯ зеленого — GreenEdit, ну И ДЛЯ СИНвГО — BlueEdit. Так же на форме есть кнопка для смены цвета (ее имя не имеет значения) и компонент CoiorDialog, для смены цвета.

 

Если вы сами создаете пример, по­старайтесь все разместить так, как показано на рисунке  выше (ближе к правому краю), потому что слева будем рисовать квадрат.

 

Для события кнопки onclick пишем код, показанный в листинге: 

 

procedure TFormi.ButtonlClick(Sender: TObj ect);

var

с:LongInt; begin

if not ColorDialogl.Execute then exit;
C:=ColorToRGB(ColorDialogl.Color);
RedEdit.Text:=IntToStr(GetRValue(C));
GreenEdit.Text:=IntToStr(GetGValue(C));
BlueEdit.Text:=IntToStr(GetBValue(C));
Repaint; end;

В разделе var объявлена одна переменная целого типа Longint. Это целое число размером в 4 байта, оно будет использоваться для хранения значения цвета.

В первой строке показывается ОКНО смены цвета ColorDialogl.Execute. Если пользователь не выбрал цвет (об этом говорит конструкция if not), то выполнение процедуры прерывается с помощью exit.

 

Дальше выбранный цвет ColorDialog1 .color из типа TCoior преобразовывается в простое число с помощью функции coiorToRGB. Этой функции надо передать цвет в виде TCoior (мы передаем ColorDialogl.color), и она вернет целое 4- байтное число, которое мы записываем в переменную с. Функция CoiorToRGB вы­полняет одно очень важное, действие— очищает первый байт, который как раз не несет смысловой нагрузки в 24-битной RGB системе.

 

В следующей строке идет присвоение строке ввода RedEdit значения красной составляющей цвета. Для этого сначала используется функция GetRValue. Ей пере­дается значение цвета в виде целого числа (переменная с). Результат—однобайт­ное число, которое показывает значение красной составляющей. Поскольку резуль­тат— число, то прежде чем его присваивать в строку ввода, оно должно быть пре­образовано в строку. Для этого переводим его в текст с помощью знакомой нам ФУНКЦИИ IntToStr.

 

То же самое проделываем и с зеленым цветом в следующей строке кода. Только для получения зеленой составляющей используется функция GetGValue.

 

Для получения синей составляющей используется функция GetBValue. Таким образом, после выполнения всех этих действий, мы разбили 4 байта цвета из пере­менной с на отдельные байты по цветам и разнесли их в соответствующие строки ввода.

 

После этого нужно заставить окно прорисоваться с помощью вызова метода Repaint.

Для события OnPaint напишем следующий код:

 

procedure TForml.FormPaint(Sender: TObj ect); begin

Canvas.Brush.Color:=RGB(StrToIntDef(RedEdit.Text, 0),

StrToIntDef(GreenEdit.Text, 0), StrToInt­Def (BlueEdit.Text,0));

Canvas.Rectangle(10,10, 250, 150);

end;

 

Здесь надо проделать обратные действия — превратить три составляющих цвета из строк ввода в одно целое значение цвета. Для этого используется функция rgb (r, g, в). У этой функции три параметра, и все они целые числа.

  • r — значение красного цвета.
  • g — значение зеленого цвета.
  • в — значение синего цвета.

В качестве параметров передаются значения, указанные в соответствующих строках ввода, с предварительным преобразованием их из строк в числа.

Результат преобразования цвета записываем в цвет кисти. После этого рисуется прямоугольник, у которого цвет фона будет тот, что мы выбрали.

И последнее — создадим обработчик события onchange для всех строк ввода.

  1. Выделите строку ввода для красного цвета.
  2. Удерживая shift, щелкните мышью по остальным строкам.

У вас должны быть выделены все строки ввода серыми рамками. Теперь перей­дите в объектный инспектор на вкладку Events и дважды щелкните мышью по со­бытию onchange, чтобы создать обработчик сразу для всех выделенных компонен­тов. В нем напишите следующий код:

 

procedure TForm1.RedEditChange(Sender: TObject);

begin

Repaint; end;

Попробуйте запустить этот пример. Теперь выбе­рите какой-нибудь цвет, и вы увидите составляющие этого цвета. Можете даже напрямую изменять зна­чения в строках ввода, и результат моментально бу­дет отражаться на цвете прямоугольника.

Работа с цветом в Delphi

ВНИМАНИЕ. Помните, что ни одна из составляю­щих цвета не может быть больше 255, иначе со­ставляющая превысит максимальный размер байта.

Ну а теперь познакомимся с константами, кото­рые уже заготовлены для основных цветов. Вы можете их реально использовать в своих програм­мах и присваивать, как ранее это делалось в при­мере. Здесь не будут перечисляться все константы, потому что вы можете их сами в любой момент найти, если щелкнете в объектном инспекторе по свойству color любого компонента. Все, что вы увиди­те в этом списке, — это и есть константы, которые можно использовать. Этот при­ем довольно удобный, потому что сразу видно константу и цвет.

 

 
dle

Помоги проекту! Расскажи друзьям об этом сайте: