Графика и мультимедиа_________________________________363

void   fastcall TFormI::FormCreate(TObject *Sender)
{

BitMap = new Graphics::TBitmap;

BitMap->Width = 1 * (L + Rhead) ;

BitMap->Height = L + Hmen + 2 * Rhead + 6;

Imagel->Canvas->MoveTo(0,Ypos+3);

Imagel->Canvas->Pen->Width = 4;

lTnagel->Canvas->LineTo(Imagel->ClientWidth,Ypos+3); // земля

Imagel->Canvas->Pen->Width = 2;

BitMap->Canvas->CopyRect(Rect(0,0,BitMap->Width,BitMap->Height),

Imagel->Canvas,Rect(Xpos-L-
Rhead,Ypos-(L+Hmen+2*Rhead+5),Xpos+L+Rhead,Ypos+1) ) ;

Draw() ;

)

Первыми операторами этой процедуры вы создаете объект BitMap и задаете
его размеры равными максимальным размерам изображения человечка. В конце
процедуры, перед вызовом Draw в компонент BitMap методом CopyRect копирует-
ся фрагмент изображения, внутри которого будет расположен рисунок человечка.
После этого процедурой Draw рисуется соответствующий кадр. Обратите внима-
ние, что в данном приложении отсутствует оператор, задававший ранее режим
пера pmNotXor. Так что по умолчанию рисунок будет делаться обычным образом.

Поскольку приложение создало объект Bitmap, надо не забыть добавить в него
обработчик события OnDestroy формы, в который вставить оператор

BitMap->Free() ;

Процедуру TimerlTimer измените следующим образом:

void   fastcall TFormI::TimerlTimer(TObject *Sender)
(
Imagel->Canvas->Draw(Xpos-L-Rhead, Ypos-L-Hmen-2*Rhead-5,BitMap);

if ((Xpos >= Imagel->Picture->Width - H) I (Xpos <= H))
revers = -revers;

Xpos = Xpos + revers * H;

num = 1 — num;

BitMap->Canvas->CopyRect(Rect(0,0,BitMap->Width,BitMap->Height),

Imagel->Canvas, Rect(Xpos-L-Rhead,
Ypos-(L+Hmen+2*Rhead+5),Xpos+L+Rhead,Ypos+1));

Draw() ;

1

Если вы сравните с тем, что было в предыдущем приложении, то увидите, что
вместо первого вызова процедуры Draw, который стирал предыдущий кадр, вво-
дится оператор Imagel->Canvas->Draw, который выполняет ту же функцию, но
путем восстановления запомненного ранее фрагмента фона под рисунком. Вторым
отличием является наличие оператора BitMap->Canvas->CopyRect, который пе-
ред вызовом Draw запоминает новый фрагмент фона.

Вот и все изменения. Выполните проект. Вы увидите, что без фона приложе-
ние работает как и прежде. Добавьте фон так же, как делали это раньше. Вы може-
те получить картинку вида, представленного на рис. 5.17. Из этой картинки вы
сможете сделать вывод, что изображение стало несколько лучше, но не на много.
На фоне земного шара фигура стала несколько более заметной. Но зато появилась
новая проблема: на черном фоне она исчезает, точнее, остаются видимы только бе-
лая голова и литавры. Так что, как говорилось выше, использовать для мульти-
пликаций пестрые фоны крайне нежелательно.

Наше изображение было очень простым и рисовалось быстро. Но при сложных
изображениях время рисования может быть заметным и приводить к мерцанию
картинки и другим неприятным зрительным эффектам. В этих случаях использу-
ют буферизацию изображения. Это напоминает то, что вы только что делали с фо-