Программирование с C++ Builder



Битовые образы



Для формирования сложных изображений используют битовые образы. Битовый образ — это, как правило, небольшая картинка, которая находится в памяти компьютера.

Сформировать битовый образ можно путем загрузки из bmp-файла или из ресурса, а также путем копирования фрагмента из другого битового образа, в том числе и с поверхности формы.

Картинку битового образа (иногда говорят просто "битовый образ") можно подготовить при помощи графического редактора или, если предполагается, что битовый образ будет загружен из ресурса программы, — при помощи редактора ресурсов (например, Borland Resource Workshop). В последнем случае надо создать файл ресурсов и поместить в него битовый образ. Файл ресурсов можно создать и при помощи утилиты Image Editor.

В программе битовый образ — это объект типа TBitmap. Некоторые свойства объекта TBitmap приведены в табл. 3.6.

Загрузку картинки из файла обеспечивает метод LoadFromFile, которому в качестве параметра передается имя bmp-файла. Например, следующий фрагмент кода обеспечивает создание и загрузку битового образа из файла.

Graphics: :TBitmap *Plane = new Graphics: :TBititiap() ;
Plane->LoadFromFile("plane.bmp");

В результате выполнения приведенного выше фрагмента, битовый образ Plane представляет собой изображение самолета (предполагается, что в файле plane.bmp находится изображение самолета).

Таблица 3.6. Свойства объекта TBitmap


Свойство

Описание

Height, Width

Размер (ширина, высота) битового образа. Значения свойств соответствуют размеру загруженной из файла (метод LoadFromFile) или ресурса (метод LoadFromResourcelD или LoadFromResourceName) картинки

Empty

Признак того, что картинка в битовый образ не загружена (true)

Transparent

Устанавливает (true) режим использования "прозрачного" цвета. При выводе битового образа методом Draw элементы картинки, цвет которых совпадает с цветом TransparentColor, не выводятся. По умолчанию значение TransparentColor определяет цвет левого нижнего пиксела

TransparentColor

Задает прозрачный цвет. Элементы картинки, окрашенные этим цветом, методом Draw не выводятся

Canvas

Поверхность битового образа, на которой можно рисовать точно так же, как на поверхности формы или компонента image


После того как битовый образ сформирован (загружен из файла или из ресурса), его можно вывести, например, на поверхность формы или компонента image. Сделать это можно, применив метод Draw к свойству Canvas. В качестве параметров методу Draw надо передать координаты точки, от которой будет выведен битовый образ. Например, оператор

Canvas->Draw(10,20,Plane);

выводит на поверхность формы битовый образ plane — изображение самолета.

Если перед применением метода Draw свойству Transparent битового образа присвоить значение true, то фрагменты рисунка, цвет которых совпадает с цветом левой нижней точки рисунка, не будут выведены. Такой прием используется для создания эффекта прозрачного фона. "Прозрачный" цвет можно задать и принудительно, присвоив соответствующее значение свойству TransparentColor.

Следующая программа демонстрирует работу с битовыми образами. После запуска программы в ее окне появляется изображение неба и двух самолетов (рис. 3.12). И небо, и самолеты — это битовые образы, загруженные из файлов во время работы программы. Загрузку и вывод битовых образов на поверхность формы выполняет функция обработки события onPaint, текст которой приведен в листинге 3.3. Белое поле вокруг левого самолета показывает истинный размер битового образа Plane. Белого поля вокруг правого самолета нет, т. к. перед тем как вывести битовый образ второй раз, свойству Transparent было присвоено значение true.



Рис. 3.12. Присвоив свойству Transparent значение true, можно скрыть фон


Листинг 3.3. Загрузка и вывод битовых образов на поверхность формы 

void __fastcall TForml::FormPaint(TObject *Sender)
{
// битовые образы: небо и самолет
Graphics::TBitmap *sky = new Graphics::TBitmap();
Graphics::TBitmap *plane = new Graphics::TBitmap();
sky->LoadFromFile("sky.bmp");
plane->LoadFromFile("plane.bmp");
Canvas->Draw(0,0,sky); // фон - небо
Canvas->Draw(20,20,plane); // левый самолет
plane-XTransparent = true;
/* теперь элементы рисунка, цвет которых совпадает
с цветом левой нижней точки битового образа,
не отображаются */
Canvas->Draw(120,20,plane); // правый самолет
// уничтожить объекты
sky->Graphics::-TBitmap();
plane->Graphics::-TBitmap();
}


Небольшие по размеру битовые образы часто используют при формировании фоновых рисунков по принципу кафельной плитки (рис. 3.13).



Рис. 3.13. Фоновый рисунок и битовый образ-плитка, из которого он составлен


Следующая программа показывает, как можно получить фоновый рисунок путем многократного вывода битового образа на поверхность формы. Формирование фонового рисунка, многократный вывод битового образа на поверхность формы выполняет функция Background. Ее объявление (прототип), а также объявление битового образа (объекта типа TBitmap) надо поместить в секцию private объявления класса формы (листинг 3.4), которая находится в заголовочном файле. Создание битового образа и загрузку картинки из файла выполняет функция обработки события onCreate. Функция обработки события OnPaint путем вызова функции Background обеспечивает вывод фонового рисунка на поверхность формы (листинг 3.5).

Листинг 3.4. Объявление битового образа и функции Background 

class TForml : public TForm
{
_published:
void__fasteal1 FormCreate(TObject *Sender);
void__fastcall FormPaint(TObject *Sender);
void__fastcall FormResize(TObject *Sender);
private:
Graphics::TBitmap *back; // элемент фонового рисунка
void __fastcall Background(); // формирует фоновый рисунок на
// поверхности формы public:
_fastcall TForml(TComponent* Owner);
};

Листинг 3.5. Функции, обеспечивающие формирование и вывод фонового рисунка

// обработка события OnCreate
void __fastcall TForml::FormCreate(TObject *Sender)
{
back = new Graphics::TBitmap(); // создать объект — битовый образ
// загрузить картинку
try // в процессе загрузки картинки возможны ошибки
{
Forml->back->LoadFromFile("Legal.bmp");
}
catch (EFOpenError &e)
{
return;
}
 }
// формирует фоновый рисунок
void __fastcall TForml::Background()
{
int x=0,y=0; // координаты левого верхнего угла битового образа
if ( back->Empty) // битовый образ не был загружен
return;
do
{
do
 {
Canvas->Draw(x,y,back); x += back->Width;
}
while (x < ClientWidth); x = 0;
у4= back->Height;
}
while (y < ClientHeight);
}
// обработка события OnPaint
void __fastcall TForml::FormPaint(TObject *Sender)
{
Background(); // обновить фоновый рисунок
}