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



Подключение файла ресурсов



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

В общем виде эта директива выглядит следующим образом:

#pragma resource ФайлРесурсов

где ФайлРесурсов — имя файла ресурсов.

Например, для программы flight_l директива, обеспечивающая включение содержимого файла ресурсов в выполняемый файл, выглядит так:

#pragma resource "images.res"

Загрузить битовый образ из ресурса можно при помощи метода LoadFromResourceName, который имеет два параметра: идентификатор программы и имя ресурса. В качестве идентификатора программы используется глобальная переменная Hinstance. Имя ресурса должно быть представлено в виде строковой константы.

Например, в программе flight_l инструкция загрузки фона из ресурса выглядит так:

back->LoadFromResourceName((int)Hinstance,"FACTORY");

В качестве примера в листинге 3.8 приведен фрагмент программы flight_l — функция TForm1:: FormCreate, которая обеспечивает загрузку битовых образов из ресурсов.

 Листинг 3.8. Загрузка битовых образов из ресурса 

// подключить файл ресурсов, в котором находятся
// необходимые программе битовые образы
#pragma resource "images.res"
void__fastcall TForml::FormCreate(TObject *Sender)
{
// загрузить фоновый рисунок из ресурса
back = new Graphics::TBitmap();
back->LoadFromResourceName((int)HInstance,"FACTORY");
// установить размер клиентской (рабочей) области формы
//в соответствии с размером фонового рисунка
ClientWidth = back->Width;
ClientHeight = back->Height;
// загрузить изображение объекта из ресурса
sprite = new Graphics::TBitmap();
sprite->LoadFromResourceName((int)HInstance,"APLANE");
sprite->Transparent = true;
// исходное положение самолета
x=-20; // чтобы самолет "вылетал" из-за левой границы окна
у=20;
}

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

Теперь рассмотрим, как можно реализовать в диалоговом окне программы вывод баннера, представляющего собой последовательность сменяющих друг друга картинок (кадров). Кадры баннера обычно находятся в одном файле или в одном ресурсе. В начале работы программы они загружаются в буфер (объект типа TBitmap). Вывод кадров баннера обычно выполняет функция обработки сигнала от таймера (события onTimer), которая выделяет очередной кадр и выводит его на поверхность формы.

Вывести кадр баннера (фрагмент битового образа) на поверхность формы можно при помощи метода copyRect, который копирует прямоугольную область одной графической поверхности на другую.

Инструкция применения метода CopyRect в общем виде выглядит так:
Canvasl->CopyRect(Область1, Canvas2, Область2)

где:

  •  Canvas1 — поверхность, на которую выполняется копирование;
  •  Canvas2 — поверхность, с которой выполняется копирование;
  •  Область1 — структура типа TRect, которая задает положение и размер области, куда выполняется копирование (приемник);
  •  Область2 — структура типа TRect, которая задает положение и размер области, откуда выполняется копирование (источник).


Определить прямоугольную область, заполнить поля структуры TRect можно при помощи функции Rect или Bounds. Функции Rect надо передать в качестве параметров координаты левого верхнего и правого нижнего углов области, функции Bounds — координаты левого верхнего угла и размер области. Например, если надо определить прямоугольную область, то это можно сделать так: ret = Rect(x1,y1,x2,y2) или так: ret = Bounds(x1,y1,w,h)

где x1, y1 — координаты левого верхнего угла области; х2, у2 — координаты правого нижнего угла области; w и h — ширина и высота области.

Следующая программа (ее текст приведен в листинге 3.9) выводит в диалоговое окно баннер — рекламное сообщение. На рис. 3.23 приведены кадры этого баннера (содержимое файла baner.bmp), а на рис. 3.24 — диалоговое окно. Форма программы содержит один-единственный компонент — таймер.



Рис. 3.23. Кадры баннера



Рис. 3.24. Воспроизведение баннера в окне программы


Листинг 3.9. Баннер (baner.h, baner_.cpp)

// baner.h
class TForml : public TForm
{ published:
TTimer *Timerl;
void__fastcall FormCreate(TObject *Sender);
void __fastcall TimerITimer(TObject *Sender);
private:
Graphics::TBitmap *baner; // баннер
TRect kadr; // кадр баннера
TRect scr; // область воспроизведения баннера
int w, h; // размер кадра
int с; // номер воспроизводимого кадра
public:
_fastcall TForml(TComponent* Owner);
};
// baner_.cpp
#define FBANER "borland.bmp" // баннер
#define NKADR 4 // количество кадров в баннере
void__fastcall TForml::FormCreate(TObject *Sender)
{
baner = new Graphics::TBitmap();
baner->LoadFromFile(FBANER); // загрузить баннер
h = baner->Height;
w = baner->Width / NKADR;
scr = Rect(10,10,10+w,10+h); // положение и размер области
// воспроизведения баннера kadr = Rect(0,0,w,h);
// положение и размер первого кадра
//в баннере
}
// обработка события OnTimer
void__fastcall TForml:rTimerlTimer(TObject *Sender)
{
// вывести кадр баннера
Canvas->CopyRect(scr,baner->Canvas,kadr);
// подготовиться к воспроизведению следующего кадра
if (с < NKADR)
{
// воспроизводимый в данный момент
// кадр — не последний
с++;
kadr.Left += w;
kadr.Right += w;
 }
else
{
с = 0;
kadr.Left = 0;
kadr.Right = w;
 }
 }

Программа состоит из двух функций. Функция TForm1:: Form-Create создает объект TBitmap и зафужает в него баннер — BMP-файл, в котором находятся кадры баннера. Затем, используя информацию о размере загруженного битового образа, функция устанавливает значения характеристик кадра: высоту и ширину.

Основную работу в программе выполняет функция обработки события onTimer, которая выделяет из битового образа Baner очередной кадр и выводит его на поверхность формы. Выделение кадра и его отрисовку путем копирования фрагмента картинки с одной поверхности на другую выполняет метод copyRect (рис. 3.25), которому в качестве параметров передаются координаты области, куда нужно копировать, поверхность и положение области, откуда нужно копировать. Положение фрагмента в фильме, т. е. координата х левого верхнего угла, определяется умножением ширины кадра на номер текущего кадра.



Рис. 3.25. Метод CopyRect копирует в область Rect1 поверхности Canvas1 область Rect2 с поверхности Canvas2


Книжный магазин