Просмотр мультипликации
Листинг 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.Timer1.Timer, обрабатывающая событие OnTimer.
Рис. 10.21. Инструкция Canvas1.CopyRect (Rect1, Canvas2, Rect2) копирует в область Rect1 поверхности Canvas1 область Rect2 с поверхности Canvas2