Мы продолжаем изучение программирования графики на Delphi. Сегодня у нас
будет маленький примерчик, но очень удаленький. Прозрачность картинки очень
часто обсуждается на различных конференциях, поэтому я решил объяснить эту
проблему всем.
Как всегда, нам понадобиться запустить Delphi и создать новый проект. Теперь
поставь на форму из палитры компонентов Additional компонент TImage
. Теперь дважды щёлкни по его свойству Picture . Перед тобой
появиться стандартный диалог выбора файла, выбери любой bmp файл, и нажимай
"ОК". У тебя должно получиться нечто похожее на рисунок 1.
Теперь щёлкни по форме и создай для неё обработчик события OnPaint .
Это событие отвечает за прорисовку экрана, и вызывается каждый раз когда окно
нуждается в прорисовке. Вспомни пример из прошлого номера, в котором мы рисовали
поворачивающийся текст, программа работает прекрасно, но как только мы свернём
её и восстановим заново, всё исчезнет. Мы должны сами восстанавливать содержимое
экрана, и делать это надо именно в обработчике OnPaint . Поэтому этот
пример мы сделаем по всем правилам.
В созданной процедуре FormPaint напиши следующее:
procedure TForm1.FormPaint(Sender: TObject);
begin
Canvas.Brush.Color:=Color;
Canvas.BrushCopy(Rect(0,0,Image1.Width,Image1.Height),
Image1.Picture.Bitmap,
Rect(0,0,Image1.Width,Image1.Height),
Image1.Picture.Bitmap.Canvas.Pixels[1,1]);
end;
Теперь можешь запустить программу и посмотреть результат. Неплохо? Давай
рассмотрим, что же мы писали, чтобы добиться этого.
Canvas.Brush.Color:=Color; Как ты уже знаешь, Canvas отвечает за то,
что будет нарисовано в окне. Поэтому, чтобы что-то нарисовать прямо на форме, мы
рисуем это здесь. У него есть свойство Brush, в котором хранятся параметры
кисти, используемой при закрашивании. Мы изменяем только один параметр у этой
кисти - цвет, которому мы присваиваем цвет формы. Взглянём на эту запись вот
так:
Область_рисования_формы.Кисть.Цвет:=Цвет_формы.
Теперь перейдём ко второй строке. Она кажется немного сложной, но это только
на первый взгляд. Поэтому рассмотрим всё по частям. М используем процедуру
BrushCopy у уже знакомого Canvas . Эта процедура копирует на Canvas
картинку.
procedure BrushCopy(
const Dest: TRect; // Область приёмника
Bitmap: TBitmap; // Картинка которая будет копироваться
const Source: TRect; // Область источника
Color: TColor); // Прозрачный цвет
Область приёмника объявлена как TRect, который имеет вид TRect = (Left,
Top, Right, Bottom: Integer); . Что находиться в скобках, я думаю пояснять
не надо. То же самое и с областью источника. В качестве картинки мы передаём
Bitmap из TImage . Прозрачный цвет будет заменяться на цвет кисти,
который мы задали в первой строке.
В качестве прозрачного цвета я использовал цвет пикселя в позиции [1,1] из
картинки TImage. На это указывает запись
Image1.Picture.Bitmap.Canvas.Pixels[1,1] . Я её запишу немного по другому:
TImage1.Его_картинка.Bitmap.Область_рисования.Пиксел[1_по_оси_X, 1_по оси_Y]
Вот и всё. Жди следующего урока.
|