logo
Курсовые / Лабораторная работа20-25

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

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

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

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

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

#pragma resource "images.res"

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

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

В качестве примера в листинге 23.8 приведен фрагмент программы flight_1 — функция 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)

где:

Определить прямоугольную область, заполнить поля структуры 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) выводит в диалоговое окно баннер — рекламное сообщение. На рис. 23.15 приведены кадры этого баннера (содержимое файла baner.bmp), а на рис. 23.16 — диалоговое окно. Форма программы содержит один-единственный компонент — таймер.

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

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

Листинг 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;// область воспроизведения баннера