Перегляд «мультика»

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