Просмотр
"мультика"
Теперь рассмотрим,
как можно реализовать вывод в диалоговом окне программы простого "мультика",
подобного тому, который можно видеть в диалоговом окне Установка связи при
подключении к Internet .
Эффект бегущего между
телефоном и компьютером красного квадратика достигается за счет того, что в
диалоговое окно выводятся сменяющие друг друга картинки.
Кадры мультика обычно
находятся в одном файле или в одном ресурсе. Перед началом работы программы
они загружаются в буфер, в качестве которого удобно использовать объект типа
TBitMap. Задача процедуры, реализующей вывод мультика, состоит в том, чтобы
выделить очередной кадр и вывести его в нужное место формы.
Вывести кадр на поверхность
формы можно применением метода copyRect к свойству canvas этой формы. Метод
CopyRect копирует прямоугольную область одной графической поверхности на другую.
Инструкция применения
метода CopyRect в общем виде выглядит так:
Canvas1.CopyRect(Область1,
Canvas2, 06ласть2)
где:
В качестве параметров
область! и область2 используются структуры типа TRect, поля которых определяют
положение и размер области.
Заполнить поля структуры
TRect можно при помощи функции Bounds, инструкция обращения к которой в общем
виде выглядит так:
Bounds(x,у,Width,Height)
где:
Следующая программа,
текст которой приведен в листинге 10.12, выводит в диалоговое окно простой мультик
— дельфийскую колонну, вокруг которой "летает" некоторый объект. На
рис. 10.19 приведены кадры этого мультика (содержимое файла film.bmp).
Диалоговое окно программы
приведено на рис. 10.20, оно содержит один единственный компонент — таймер.
Рис. 10.19. Кадры мультика
Рис. 10.20. Форма
программы
Тистинг 10.12.
Мультик (использование метода CopRect)
unit
multik ;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics,
Controls, Forms, Dialogs,
ExtCtrls,
StdCtrls;
type
TForm1
= class(TForm)
Timer1:
TTimer;
procedure
FormActivate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1l:
TForm1;
implementation
($R
*.DFM}
const
FILMFILE = 'film2.bmp'; // фильм — bmp-файл
N_KADR=12;
// кадров в фильме (для данного файла)
var
Film:
TBitMap; // фильм — все кадры
WKadr,HKadr:
integer; // ширина и высота кадра
CKadr:
integer; // номер текущего кадра
RectKadr:
TRect; // положение и размер кадра в фильме
Rect1
: Trect; // координаты и размер области отображения фильма
procedure TForm1.FormActivate(Sender: TObject);
begin
Film := TBitMap.Create;
Film.LoadFromFile(FILMFILE);
WKadr := Round(Film.Width/N_Kadr);
HKadr
:= Film.Height;
Rect1 := Bounds(10,10,WKadr,HKadr);
Ckadr:=0;
Form1.Timerl.Interval := 150; // период обновления кадров — 0.15 с
Form1.Timerl.Enabled:=True; // запустить таймер
end;
// отрисовка кадра procedure DrawKadr;
begin
// определим положение текущего кадра в фильме
RectKadr:=Bounds(WKadr*CKadr,0,WKadr,HKadr);
//
вывод кадра из фильма
Form1.Canvas.CopyRect(Rect1,Film*.Canvas,RectKadr);
// подготовимся к выводу следующего кадра
CKadr := CKadr+1;
if
CKadr = N_KADR then CKadr:=0;:
end;
//
обработка сигнала от таймера
procedure
TForm1.Timer1Timer(Sender: TObject);
begin
DrawKadr;
end;
end.
Программа состоит из
трех процедур. Процедура TForm1. FormActivate создает объект Film и загружает
в него фильм — BMP-файл, в котором находятся кадры фильма. Затем, используя
информацию о размере загруженного битового образа, процедура устанавливает значения
характеристик кадра: высоту и ширину.
После этого создается
объект Kadr (типа TBitMap), предназначенный для хранения текущего кадра. Следует
обратить внимание, что после создания объекта Kadr принудительно устанавливаются
значения свойств width и Height. Если этого не сделать, то созданный объект
будет существовать, однако память для хранения битового образа не будет выделена.
В конце своей работы процедура TForml. FormActivate устанавливает номер текущего
кадра и запускает таймер.
Основную работу в программе
выполняет процедура DrawKadr, которая выделяет из фильма очередной кадр и выводит
его в форму. Выделение кадра и его отрисовку путем копирования фрагмента картинки
с одной поверхности на другую выполняет метод copyRect (рис. 10.21), которому
в качестве параметров передаются координаты области, куда нужно копировать,
поверхность и положение области, откуда нужно копировать. Положение фрагмента
в фильме, т. е. координата х левого верхнего угла, определяется умножением ширины
кадра на номер текущего кадра. Запускает процедуру DrawKadr процедура TForm1.Timer1Timer,
обрабатывающая событие OnTiner.
Рис. 10.21. Инструкция Canvas1. CopyRect (Rect1, Canvas2, Rect2) копирует в область Rectl поверхности Canvasl область Rect2 с поверхности Canvas2