Компонент 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;
// кнопка Следующий кадр недоступна }