Просмотр "мультика"
Теперь
рассмотрим, как можно реализовать вывод в диалоговом окне программы простого
"мультика", подобного тому, который можно видеть в диалоговом окне Установка
связи при подключении к Internet .
Эффект бегущего
между телефоном и компьютером красного квадратика достигается за счет того, что
в диалоговое окно выводятся сменяющие друг друга картинки.
Кадры мультика
обычно находятся в одном файле или в одном ресурсе. Перед началом работы
программы они загружаются в буфер, в качестве которого удобно использовать
объект типа TBitMap. Задача процедуры, реализующей вывод мультика, состоит в
том, чтобы выделить очередной кадр и вывести его в нужное место
формы.
Вывести кадр на
поверхность формы можно применением метода copyRect к свойству canvas этой
формы. Метод CopyRect копирует прямоугольную область одной графической
поверхности на другую.
Инструкция
применения метода CopyRect в общем виде выглядит так:
Canvas1.CopyRect(Область1,
Canvas2, 06ласть2)
где:
- canvas1 — графическая
поверхность, на которую выполняется копирование;
- Canvas2 — графическая
поверхность, с которой выполняется копирование;
- параметр Область2 —-
задает положение и размер копируемой прямоугольной области, а параметр областьi
— положение копии на поверхности Canvas1.
В качестве
параметров область! и область2 используются структуры типа TRect, поля которых
определяют положение и размер области.
Заполнить поля
структуры TRect можно при помощи функции Bounds, инструкция обращения к которой
в общем виде выглядит так:
Bounds(x,у,Width,Height)
где:
- х и у — координаты левого
верхнего угла области;
- width и Height — ширина и
высота области.
Следующая
программа, текст которой приведен в листинге 10.12, выводит в диалоговое окно
простой мультик — дельфийскую колонну, вокруг которой "летает" некоторый объект.
На рис. 10.19 приведены кадры этого мультика (содержимое файла
film.bmp).
Диалоговое окно
программы приведено на рис. 10.20, оно содержит один единственный компонент —
таймер.
Рис.
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