Представление цвета в Windows
Основной элемент монитора – электронная лучевая трубка. Трубка отображает все цвета спектра на основе сложения трех основных цветов: красного, зеленого и синего (Red, Green и Blue). Модель воспроизведения цвета на основе сложения цветов называется аддитивной. Изменяя пропорции основных цветов, мы получаем все многообразие цветов.
Для представления цвета в Windows применяется 32-разрядное целое число
(LongWord). Младший байт числа содержит значение красного, второй байт – зеленого и третий байт – синего цветов. Старший байт должен быть равен
нулю (рис. 10.2). Величина каждого из трех цветов может изменяться в пределах от 0 до 255, и чем больше значение, тем больше интенсивность соответствующего цвета. В терминах GDI тип данных для представления цвета называется COLORREF. В Delphi для описания цвета реализован аналог COLORREF –тип данных TColor:
typeTColor = -$7FFFFFFF-1..$7FFFFFFF;
Для удобства работы с «RGB-цветом» в Windows API предусмотрен ряд макросов. Макрос RGB() преобразует значения интенсивности трех цветов в определенный в Windows тип данных COLORREF (соответствующий двойному слову LongWord):
functionRGB(bRed, bGreen, bBlue : BYTE) : LongWord;
Для проверки макроса поместите на форму три компонента TTrackBar. Переименуйте их в tbRed, tbBlue и tbGreen соответственно. Свойствам Max всех компонентов назначьте значение 255. Затем опишите обработчик события OnChange() любого из элементов управления, как показано в примере:
procedureTForm1.tbRedChange(Sender: TObject);
Begin
Form1.Color:=RGB(tbRed.Position,tbGreen.Position,tbBlue.Position);
Form1.Caption:=Format('Red=%d Green=%d Blue=%d',
[tbRed.Position,tbGreen.Position,tbBlue.Position]);
end;
В заключение сделайте этот обработчик события общим для всех трех ползунков TTrackBar и запустите новый проект. С изменением местоположения ползунка будет изменяться цвет рабочей поверхности формы. Заголовок формы отслеживает текущее значение всех составляющих RGB-цвета. Возможна и обратная операция: извлечение значений цветовых составляющих из полного значения RGB-цвета:
functionGetRValue(lwRGB: LongWord):Byte; // красный
functionGetGValue(lwRGB: LongWord):Byte; // зеленый
functionGetBValue(lwRGB: LongWord):Byte; // синий
Цветам, наиболее часто применяемым в Delphi, соответствуют именованные
константы. Их несколько десятков. Например, черному цвету соответствует
константа clBlack, белому – clWhite. Кроме базовых цветов эти константы
способны описывать системные цвета – цвета, которыми будут отображаться рамки окон, тени, кнопки, текст. Например, цвет окна – clWindow, цвет поверхности кнопки – clButtonFace.
Перо – класс TPen
Класс TPen (Перо) применяется для определения характеристик линий, рисуемых на поверхности холста (любого элемента управления Delphi, обладающего свойством Canvas). Доступ к дескриптору пера осуществляется через свойство:
propertyHandle: HPen;
Цвет пера и толщина линии в пикселах определяются в свойствах:
propertyColor: TColor;
propertyWidth: Integer;
В составе GDI предусмотрено всего три стиля пера: сплошное черное, сплошное белое и пустое перо. Собственное перо можно получить, создав собственное логическое перо при помощи функции Windows API (CreatePen() или CreatePenIndent()). Программисты Borland как всегда пошли нам навстречу и инкапсулировали в классе TPen свойство, определяющее стиль пера:
propertyStyle: TPenStyle;
typeTPenStyle = (psSolid, psDash, psDot, psDashDot, psDashDotDot, psClear,
psInsideFrame);
На рис. 10.3 представлены семь базовых стилей класса TPen, использование
которых (за исключением psSolid и psInsideFrame) имеет смысл только при
толщине пера не более 1 пиксела, в противном случае вы получите сплошную линию. Стиль psClear соответствует пустому перу – рисование отключается.
Стоит особо отметить стиль psInsideFrame, который обычно используется при рисовании простейших геометрических фигур пером шириной более 1 пиксела. Дело в том, что при использовании утолщенного пера (Style <> psInsideFrame) границы фигуры расширяются относительно заданных координат. Если вы нарисуете прямоугольник с координатами левого верхнего угла (10,10) и правого нижнего (100,100) пером psSolid толщиной 10 пикселов, действительный верхний угол окажется в точке (1,1), а нижний – в точке (109,109). Границы фигуры расширятся ровно на ширину пера. Установка текущего пера
в состояние psInsideFrame запретит расширяться границам фигуры – линия будет утолщена вовнутрь.
Поместите на форму комбинированный список TComboBox и заполните его
свойство Items названиями перьев в классе TPenStyle (psSolid, psDash и т. д.):
procedureTForm1.ComboBox1Change(Sender: TObject);
Begin
Дата добавления: 2016-03-15; просмотров: 843;