DelphiComponent.ru — бесплатно видеоуроки по Delphi, статьи, исходники
Работа с цветом в 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. Это целое число размером в 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
StrToIntDef(GreenEdit.Text, 0), StrToIntDef (BlueEdit.Text,0));
Canvas.Rectangle(10,10, 250, 150);
Здесь надо проделать обратные действия — превратить три составляющих цвета из строк ввода в одно целое значение цвета. Для этого используется функция rgb (r, g, в). У этой функции три параметра, и все они целые числа.
- r — значение красного цвета.
- g — значение зеленого цвета.
- в — значение синего цвета.
В качестве параметров передаются значения, указанные в соответствующих строках ввода, с предварительным преобразованием их из строк в числа.
Результат преобразования цвета записываем в цвет кисти. После этого рисуется прямоугольник, у которого цвет фона будет тот, что мы выбрали.
И последнее — создадим обработчик события onchange для всех строк ввода.
- Выделите строку ввода для красного цвета.
- Удерживая shift, щелкните мышью по остальным строкам.
У вас должны быть выделены все строки ввода серыми рамками. Теперь перейдите в объектный инспектор на вкладку Events и дважды щелкните мышью по событию onchange, чтобы создать обработчик сразу для всех выделенных компонентов. В нем напишите следующий код:
procedure TForm1.RedEditChange(Sender: TObject);
Попробуйте запустить этот пример. Теперь выберите какой-нибудь цвет, и вы увидите составляющие этого цвета. Можете даже напрямую изменять значения в строках ввода, и результат моментально будет отражаться на цвете прямоугольника.
Ну а теперь познакомимся с константами, которые уже заготовлены для основных цветов. Вы можете их реально использовать в своих программах и присваивать, как ранее это делалось в примере. Здесь не будут перечисляться все константы, потому что вы можете их сами в любой момент найти, если щелкнете в объектном инспекторе по свойству color любого компонента. Все, что вы увидите в этом списке, — это и есть константы, которые можно использовать. Этот прием довольно удобный, потому что сразу видно константу и цвет.
Источник