Просмотр "мультика"

Теперь рассмотрим, как можно реализовать вывод в диалоговом окне программы простого "мультика", подобного тому, который можно видеть в диалоговом окне Установка связи при подключении к 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