Отправляет email-рассылки с помощью сервиса Sendsay

Delphi на каждый день

  Все выпуски  

Delphi на каждый день . Выпуск #1


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

#1

Delphi на каждый день
Выпуск #1 - Сентябрь 2001 года

Этот выпуск для Вас подготовил Баринов Александр.

Здравствуйте, уважаемые подписчики!

Вот и пришла наша следующая встреча. Сегодня мы поговорим о цвете вообще. Казалось бы, при чем в программировании цвет? Но цвет играет совсем не последнюю роль в интерфейсе программы. А помните, как было приятно работать и открывать вновь и вновь какую-то программу с весьма удачным, дружелюбным, красивым интерфейсом, а как было неприятно работать в программе, где кнопка лезла на кнопку, и, вообще, ничего нельзя было понять?

Конечно, сейчас роль оформления интерфейса в серьезных программах перешла к отдельным людям - художникам-дизайнерам. А если Вы просто хотите написать маленькую, но симпатичную программку? Нет, программист определенно должен обладать хотя бы понятием о цвете. А ведь, кроме всего, это так интересно...


Ссылки...

Вы можете связаться c автором с помощью E-mail.

Если Вы пропустили предыдущие выпуски рассылки, Вы можете найти их в архиве.

Если Вам интересно посмотреть, как работает то, что описано в текущем выпуске, Вы можете прямо сейчас скачать архив с примерами алгоритмов. Файлы написаны в Delphi 5, но не откомпилированы. Архив в формате ZIP и занимает, обычно, около 10 Кбайт.


В этом выпуске...

- Язык. Этот цветной мир или почему RGB?
- Тип. Что такое TColor и с чем его едят?
- Алгоритм. Градиентная заливка и сложение цветов.


Язык

Этот цветной мир или почему RGB?

Аббревиатура RGB, как, наверное, знают все, переводится на русский как Красный-Зеленый-Синий. Именно из этих трех цветов складываются остальные цвета и оттенки, которые мы видим на экранах телевизоров или мониторов. Не следует, однако, думать, что это единственная схема представления цветов. В печати, например, используется схема CMYK, а наш человеческий глаз вообще не имеет ничего общего ни с RGB, ни с CMYK.

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

Итак, согласно теории RGB любой цвет, который мы можем получить, состоит из трех компонентов: красного цвета, зеленого цвета и синего цвета. Соответственно каждый цвет или оттенок зависит только от того, какую яркость будет иметь каждая из составляющих компонент. Если, например, зеленая и синяя составляющая будет равна нулю, то остается только красная составляющая, яркость которой будет определять оттенок красного цвета.

Опять-таки, согласно теории RGB каждая компонента должна иметь свою яркость. Яркость разделили на 256 градаций (от 0 до 255). Во-первых, под это хорошо подходит то, что яркость одной компоненты описывается одним байтом, и, во-вторых, при такой градации мы получаем 256*256*256=16'777'216 цветов (что вполне достаточно для адекватного восприятия изображения).

Любой из более 16 миллионов цветов можно получить по трем координатам.

Соответственно, в языке должна быть команда, которая генерирует цвет по заданным трем числам. И такая команда есть в Delphi. Это:

function RGB(red, green, blue: byte): TColor;

Пример использования функции:
Var C: TColor;
begin
  C:=RGB(255,255,0);
end;

При таких значениях функции, в переменную C будет записан желтый цвет.

Кроме того, я также рекомендую Вам запомнить следующие константы, которые соответствуют основным цветам. Их легко запомнить, зная английский.

Константа
Цвет
clAqua
.
clBlack
.
clBlue
.
clGray
.
Константа
Цвет
clFuchsia
.
clGreen
.
clLime
.
clMaroon
.
Константа
Цвет
clNavy
.
clOlive
.
clPurple
.
clRed
.
Константа
Цвет
clTeal
.
clWhite
.
clYellow
.
clSilver
.

Таким образом, clYellow = RGB(255,255,0) (см. пример выше).

Кроме приведенных здесь цветовых констант, существуют также цветовые "переменные". Это также символьные названия цветов, которые соответствуют цвету каких-либо системных элементов Windows (например, цвет активного заголовка, цвет шрифта всплывающей подсказки и так далее). Такие цветовые "переменные" целиком и полностью зависят от установленных в системе настроек. В частности от Оформления Рабочего стола (см. Панель управления > Экран > Оформление).

Вот эти переменные:

clScrollBar - цвет полосы прокрутки. Если присмотреться, то полоса прокрутки залита не полностью, а точками (используйте экранную лупу для просмотра) какого-то цвета и белыми точками. Так вот эта переменная возвращает цвет не белых точек.
clBackground - цвет заливки Рабочего стола.
clActiveCaption - цвет Заголовка активного окна.
clInactiveCaption - цвет Заголовка неактивного окна.
clMenu - цвет Строки меню.
clWindow - цвет Окна.
clWindowFrame - цвет Границы окна.
clMenuText - цвет шрифта, используемого в Строке меню.
clWindowText - цвет шрифта, используемого в Окне.
clCaptionText - цвет шрифта, используемого в Заголовке активного окна.
clActiveBorder - цвет рамки Активного окна.
clInactiveBorder - цвет рамки Неактивного окна.
clAppWorkSpace - цвет Рабочей области приложений.
clHighlight - цвет выделенного пункта меню.
clHighlightText - цвет текста выделенного пункта меню.
clBtnFace - цвет Рельефных объектов.
clBtnShadow - цвет Тени рельефных объектов.
clGrayText - цвет текста компонентов, у которых свойство Enabled равно False.
clBtnText - цвет текста Рельефных объектов.
clInactiveCaptionText - цвет шрифта, используемого в Заголовке неактивного окна.
clBtnHighlight - Светлый цвет рельефных объектов (противоположный тени).
cl3DDkShadow - цвет Тени для трехмерных экранных элементов.
cl3DLight - Светлый цвет трехмерных экранных объектов.
clInfoText - цвет Текста всплывающей подсказки.
clInfoBk - цвет Фона всплывающей подсказки.

Вот и все основные знания о цвете. Примеры смотрите в архиве. А где можно использовать то, что здесь было описано? Да где угодно - это зависит только от Вашей фантазии и творчества. Не бойтесь - творите!

Содержание

Тип

Что такое TColor и с чем его едят?

Для хранения цвета существует свой собственный тип, который называется TColor. Этот тип содержит информацию, как о самом цвете, так и том, каким образом его заменить, если, например, цветовая палитра системы не поддерживает этот цвет (скажем, установлено всего 256 цветов, а цвет, заданный в переменной, вылезает далеко за пределы этих 256 цветов).

Тип TColor состоит из четырех байт. Первый байт - указатель на замену цвета (о нем поговорим позже). Второй байт - яркость красного цвета от 0 до 255 (от 00 до FF). Третий байт - яркость зеленого цвета от 0 до 255 (от 00 до FF). И, наконец, четвертый байт - яркость синего цвета, также, от 0 до 255 (от 00 до FF).

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

Поговорим теперь о первом байте - указателе на замену цвета. Итак, этот байт может принимать три различных значения - ноль ($00), единицу ($01) или двойку ($02). Что это значит:

Ноль ($00) - цвет, который не может быть воспроизведен точно, заменяется ближайшим цветом из системной палитры.
Единица ($01) - цвет, который не может быть воспроизведен точно, заменяется ближайшим цветом из палитры, которая установлена сейчас.
Двойка ($02) - цвет, который не может быть воспроизведен точно, заменяется ближайшим цветом из палитры, которую поддерживает текущее устройство вывода (в нашем случае - монитор).

Видимо, всегда лучше устанавливать значение первого байта равным нулю ($00), по крайней мере, так происходит при получении типа TColor при помощи функции RGB.

И, напоследок, несколько примеров:
$00FFFFFF - белый цвет;
$00000000 - черный цвет;
$00800000 - темно-красный цвет.

И как всегда, не бойтесь экспериментировать!

Содержание

Алгоритм

Градиентная заливка и сложение цветов.

Иногда бывает нужно сложить два или более цветов для получения что-то типа переходного цвета. Делается это весьма просто. Координаты получаемого цвета будут равны среднему значению соответствующих координат всех цветов.

Например, нужно сложить красный и синий. Получаем
(255,0,0)+(0,0,255)=((255+0) div 2,(0+0) div 2,(0+255) div 2)=(127,0,127).

В результате получаем сиреневый цвет. Также надо поступать, если цветов более чем 2: сложить соответствующие координаты, потом каждую сумму разделить нацело на количество цветов.

Поговорим теперь о градиентной заливке. Градиентная заливка - это заливка цветом с плавным переходом от одного цвета к другому.

Итак, пусть заданы 2 цвета своими координатами ((A1, A2, A3) и (B1, B2, B3)) и линия (длиной h пикселов), по которой нужно залить. Тогда каждый цвет каждого пиксела, находящегося на расстоянии x пикселов от начала будет равен (A1-(A1-B1)/h*x, A2-(A2-B2)/h*x, A3-(A3-B3)/h*x). Теперь, имея линию с градиентной заливкой, можно таким образом залить совершенно любую фигуру: будь то прямоугольник, круг или просто произвольная фигура.

Вот как выглядит описанный алгоритм:

{Считается, что координаты первого цвета равны (A1, A2, A3), а второго (B1, B2, B3)}
{Кроме того, линия начинается в координатах (X1,Y1), а заканчивается в (X2,Y1)}

Var h,i: Integer;

begin
  h:=X2-X1-1;
  for i:=0 to h do begin
    PaintBox1.Canvas.Pen.Color:=RGB(A1-(A1-B1)/h*i, A2-(A2-B2)/h*i, A3-(A3-B3)/h*i);
    PaintBox1.Canvas.Pen.Rectangle(I,Y1,I+1,Y1);
  end;
end.

Более подробно рассмотреть работу алгоритма можно в архиве с примерами алгоритмов. В принципе, алгоритм не сложный, и может быть легко выведен. Я думаю, что в более мелких нюансах Вы разберетесь сами, особенно с архивом примеров.

Содержание

Опрос

Уважаемые подписчики! Найдите, пожалуйста, несколько секунд, чтобы ответить на представленный здесь вопрос. Это поможет сделать мне рассылку более информативной и привлекательной. Просто нажмите на вариант ответа, а потом отправьте созданное письмо.

Какую из этих тем Вы бы хотели увидеть в следующих выпусках?

1. Работа с датой и временем в Delphi.
2. Беседа о типах переменных.
3. О системах исчисления и их применении.
4. Delphi и Internet.

5. Хотел бы увидеть все эти темы.
6. Никакую из вышеперечисленных (пожалуйста, по возможности, укажите какую тему Вы хотели бы видеть).

Спасибо за участие в опросе!


Заключение

Если Вам понравилась рассылка, перешлите ее друзьям. Пусть они почитают и тоже подпишутся. А подписаться можно прямо здесь. Для этого достаточно ввести Ваш e-mail и нажать кнопку Ok.

Рассылки Subscribe.Ru
Delphi на каждый день

До скорой встречи!
Всегда Ваш Баринов Александр



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное