Робота з кольором в Delphi
В іграх і графічних пакетах цього байту знайшли застосування. Він часто вказує прозорість, але в офісних додатках його просто ігнорують.
Як ви вже знаєте, один байт може приймати значення від 0 до 255 (в десятковій формі) або від 0 до FF (в шістнадцятковій). Так що в шістнадцятковій формі колір буде виглядати як SOOFFFFFF. Тільки тут відразу треба зазначити, що перші два нуля - це зайвий байт, потім йдуть FF для блакитного кольору, потім FF для зеленого і останні FF для червоного. Виходить, що в пам'яті колір зберігається як BGR (в зворотному порядку). Абсолютно червоний колір буде дорівнює $ 000000FF. абсолютно зелений - $ 0000FF00. а блакитний - S00FF0000.
Давайте спробуємо навчитися працювати з кольором на практиці, заодно і познайомимося з необхідними функціями. Створіть новий додаток і встановіть на нього компоненти так, як це показано на рис.
Отже, на формі три компонента TEdit. Для червоного кольору компонент назвіть RedEdit, ДЛЯ зеленого - GreenEdit, ну І ДЛЯ СІНвГО - BlueEdit. Так само на формі є кнопка для зміни кольору (її ім'я не має значення) і компонент CoiorDialog, для зміни кольору.
Якщо ви самі створюєте приклад, постарайтеся все розмістити так, як показано на малюнку вище (ближче до правого краю), тому що зліва будемо малювати квадрат.
Для події кнопки # 111; nclick пишемо код, показаний в лістингу:
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 - значення зеленого кольору.
- в - значення синього кольору.
Як параметри передаються значення, зазначені у відповідних рядках введення, з попереднім перетворенням їх з рядків у числа.
Результат перетворення кольору записуємо в колір кисті. Після цього малюється прямокутник, у якого колір фону буде той, що ми вибрали.
І останнє - створимо обробник події # 111; nchange для всіх рядків вводу.
- Виділіть рядок введення для червоного кольору.
- Утримуючи shift, клацніть по інших рядках.
У вас повинні бути виділені всі рядки введення сірими рамками. Тепер перейдіть в об'єктний інспектор на вкладку Events і двічі клацніть мишею по події # 111; nchange, щоб створити обробник відразу для всіх виділених компонентів. У ньому напишіть наступний код:
procedure TForm1.RedEditChange (Sender: TObject);
Спробуйте запустити цей приклад. Тепер виберіть який-небудь колір, і ви побачите складові цього кольору. Можете навіть безпосередньо змінювати значення в рядках введення, і результат моментально буде відображатися на кольорі прямокутника.
УВАГА. Пам'ятайте, що жодна зі складових кольору не може бути більше 255, інакше складова перевищить максимальний розмір байта.
Ну а тепер познайомимося з константами, які вже заготовлені для основних кольорів. Ви можете їх реально використовувати в своїх програмах і привласнювати, як раніше це робилося в прикладі. Тут не будуть перераховуватися всі константи, тому що ви можете їх самі в будь-який момент знайти, якщо клацнете в об'єктному інспектора по властивості color будь-якого компонента. Все, що ви побачите в цьому списку, - це і є константи, які можна використовувати. Цей прийом досить зручний, тому що відразу видно константу і колір.