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



Компонент Animate



Компонент Animate, значок которого находится на вкладке Win32 (рис. 4.1), позволяет воспроизводить простую, не сопровождаемую звуком анимацию, кадры которой находятся в AVI-файле.



Рис. 4.1. Значок компонента Animate


Компонент Animate добавляется к форме обычным образом. После того как компонент будет добавлен к форме, следует выполнить его настройку — установить значения свойств. Свойства компонента Animate перечислены в табл. 4.1.

Таблица 4.1. Свойства компонента Animate


Свойство

Описание

Name

Имя компонента. Используется для доступа к свойствам компонента и для управления его поведением

FileName

Имя AVI-файла, в котором находится анимация, отображаемая при помощи компонента

FrameWidth

Ширина кадров анимации

FrameHeight

Высота кадров анимации

FrameCount

Количество кадров анимации

AutoSize

Признак автоматического изменения размера компонента в соответствии с размером кадров анимации

Cente-r

Признак центрирования кадров анимации в поле компонента. Если значение свойства равно true и размер компонента больше размера кадров (AutoSize = false), кадры анимации располагаются в центре поля компонента

StartFrame

Номер кадра, с которого начинается отображение анимации

StopFrame

Номер кадра, на котором заканчивается отображение анимации

Active

Признак активизации процесса отображения анимации

Color

Цвет фона компонента (цвет "экрана"), на котором воспроизводится анимация

Transparent

Режим использования "прозрачного" цвета при отображении анимации

Repetitions

Количество повторов отображения анимации

CommonAVI

Определяет стандартную анимацию Windows (см. табл. 4.2)


Компонент Animate позволяет программисту использовать в своих программах стандартные анимации Windows. Вид анимации определяется значением свойства CommonAVI. Значение свойства задается при помощи именованной константы. В табл. 4.2 приведены некоторые константы, вид анимации и описание процессов, для иллюстрации которых используются эти анимации.

Таблица 4.2. Значение свойства conwonAVI определяет анимацию


Значение

Анимация

Процесс

aviCopyFiles

Копирование файлов

aviDeleteFile

Удаление файла

aviRecycleFile

Удаление файла в корзину


Следует еще раз обратить внимание, что компонент Animate предназначен для воспроизведения AVI-файлов, которые содержат только анимацию. При попытке записать в свойство FileName имя файла, в котором находится сопровождаемая звуком анимация, возникает исключение и C++ Builder выводит сообщение об ошибке Cannot open AVI.

Следующая программа (вид ее диалогового окна приведен на рис. 4.2, а текст— в листинге 4.1) демонстрирует использование компонента Animate для просмотра анимации.



Рис. 4.2. Форма программы "Просмотр анимации"


После запуска программы в форме будет выведен первый кадр анимации, которая находится в каталоге проекта. Если ни одного файла с расширением avi в каталоге проекта нет, то поле компонента Animate останется пустым.

Имя файла, в котором находится анимация, можно ввести в поле Edit1 или выбрать в стандартном диалоговом окне Открыть файл, которое становится доступным в результате щелчка на кнопке Выбрать. Доступ к стандартному диалоговому окну Открыть файл обеспечивает компонент opendialog1. Значок компонента opendialog находится на вкладке Dialogs.

Программа "Просмотр анимации" обеспечивает два режима просмотра: непрерывный и по кадрам. Кнопка Button1 используется как для инициализации процесса воспроизведения анимации, так и для его приостановки. Процесс непрерывного воспроизведения анимации инициирует процедура обработки события onclick на кнопке Пуск, которая присваивает значение true свойству Active. Эта же процедура заменяет текст на кнопке Button1 с "Пуск" на "Стоп". Режим воспроизведения анимации выбирается при помощи переключателей RadioButton1 и RadioButton2. Процедуры обработки события Onclick на этих переключателях изменением значения свойства Enabled блокируют или, наоборот, делают доступными кнопки управления: активизации воспроизведения анимации (Buttoni), перехода к следующему (Button2) и предыдущему (Buttons) кадру. Во время непрерывного воспроизведения анимации процедура обработки события onckick на кнопке Стоп (Buttoni) присваивает значение false свойству Active и тем самым останавливает процесс воспроизведения анимации.

Листинг 4.1. Использование компонента Animate

// обработка события OnCreate
void__fastcall TForml::FormCreate(TObject *Sender)
{
TSearchRec sr; // содержит информацию
//о файле, найденном функцией FindFirst
// найдем AVI-файл в текущем каталоге
if (FindFirst("*.avi",faAnyFile, sr) == 0)
 {
Editl->Text = sr.Name;
/* если анимация содержит звук, то при
выполнении следующего оператора произойдет
ошибка, т. к. компонент Animate обеспечивает
воспроизведение только простой,
не сопровождаемой звуком анимации */
try
{
Animatel->FileName = sr.Name;
}
catch (Exception &e)
 {
return;
}
RadioButtonl->Enabled = true;
RadioButton2->Enabled = true;
Buttonl->Enabled = true; } }
// щелчок на кнопке Выбрать
void __fastcall TForml::Button4Click(TObject *Sender)
{
OpenDialogl->InitialDir = "";
 // открыть каталог, из которого
// запущена программа
OpenDialogl->FileName = "*.avi";
// вывести список AVI-файлов
if ( OpenDialogl->Execute()) {
// пользователь выбрал файл и нажал кнопку Открыть
// Компонент Animate может отображать только простую,
// не сопровождаемую звуком анимацию. Поэтому
// при выполнении следующей инструкции возможна ошибка
try
{
Animatel->FileName = OpenDialogl->FileName;
}
catch (Exception &e)
 {
Editl-XText = "";
// сделаем недоступными кнопки управления
RadioButtonl->Enabled = false;
RadioButton2->Enabled = false;
Buttonl->Enabled = false;
Button2->Enabled = false;
Button3->Enabled = false;
// сообщение об ошибке AnsiString msg =
"Ошибка открытия файла " +
OpenDialogl->FileName +
"ХпВозможно анимация сопровождается звуком.";
ShowMessage(msg); return;
}
Editl-XText = OpenDialogl->FileName;
// отобразить имя файла
RadioButtonl->Checked = true;
// режим просмотра — непрерывно
Buttonl->Enabled = true;
// кнопка Пуск доступна Button2->Enabled = false;
// кнопка Предыдущий кадр недоступна
Button3->Enabled = false;
// кнопка Следующий кадр недоступна
RadioButtonl->Enabled = true;
 RadioButton2->Enabled = true;
}
}
// щелчок на кнопке Пуск/Стоп
void__fastcall TForml::ButtonlClick(TObject *Sender)
{
if (Animatel->Active)
{
// анимация отображается, щелчок на кнопке Стоп
Animatel->Active = false; Buttonl->
Caption = "Пуск";
RadioButton2->Enabled = true;
}
else // щелчок на кнопке Пуск
(
// активизировать отображение анимации
Animatel->StartFrame = 1;
// с первого кадра
Animatel->StopFrame = Animatel->FrameCount;
// по последний кадр
Animatel->Active = true;
Buttonl->Caption = "Стоп";
RadioButton2->Enabled = false;
}
}
// выбор режима просмотра всей анимации
void __fastcall TForml::RadioButtonlClick(TObject *Sender)
{
Buttonl->Enabled = true; // кнопка Пуск/Стоп доступна
// сделать недоступными кнопки режима просмотра по кадрам
Button2->Enabled = false;
Button3->Enabled = false;
Animatel->Active = false; }
// выбор режима просмотра по кадрам
void __fastcall TForml::RadioButton2Click(TObject *Sender)
{
Buttonl->Enabled = false; // кнопка Пуск/Стоп недоступна
Button2->Enabled = true; // кнопка Следующий кадр доступна
Button3->Enabled = false; // кнопка Предыдущий кадр недоступна
// отобразить первый кадр
Animatel->StartFrame =1;
Animatel->StopFrame = 1;
Animatel->Active = true;
CFrame =1; // запомним номер отображаемого кадра
 }
// щелчок на кнопке Следующий кадр
void__fastcall TForml::Button2Click(TObject *Sender)
{
CFrame++;
// отобразить кадр
Animatel->StartFrame = CFrame;
Animatel->StopFrame = CFrame;
Animatel->Active = true;
if (CFrame > 1)
Button3->Enabled = true;
if (CFrame == Animatel->FrameCount)
// отобразили последний кадр
Button2->Enabled = false;
// кнопка Следующий кадр недоступна }
// щелчок на кнопке Предыдущий кадр
void__fastcall TForml::Button3Click(TObject *Sender)
{
if (CFrame == Animatel->FrameCount)
 // последний кадр Button2->Enabled = true;
CFrame—;
// отобразить кадр
Animatel->StartFrame = CFrame;
Animatel->StopFrame = CFrame;
Animatel->Active = true;
if (CFrame == 1)
Button3->Enabled = false;
// кнопка Следующий кадр недоступна
}

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