Помимо объекта Image, рисовать можно непосредственно на форме или панели. Например, проведем белые диагональные полосы на форме, превратив ее в подобие Андреевского флага. Для этого напишем следующий обработчик нажатия на кнопку:
procedure TForm1.Button1Click(Sender: TObject);
begin
with Self.Canvas do
begin
Pen.Color:=clWhite;
Pen.Width:=20;
MoveTo(0,0);
LineTo(Self.ClientWidth,Self.ClientHeight);
MoveTo(Self.ClientWidth,0);
LineTo(0,Self.ClientHeight)
end
end;
Данный фрагмент проводит две белые полосы шириной в 20 пикселов по диагонали формы. Точка (0,0) формы находится в ее левом верхнем углу. Обратите внимание, что для определения размеров формы используются свойства формы ClientWidth и ClientHeight, а не просто Width и Height. Дело в том, что свойства Width и Height содержат полный размер формы, включая полоску заголовка, а ClientWidth и ClientHeight – лишь размеры так называемой клиентской части формы, на которой можно размещать другие объекты.
Если запустить нашу программу и щелкнуть по кнопке, полосы действительно отрисуются (Рис. 14, а). Но... Попробуем перетащить окно программы так, чтобы оно частично оказалось за пределами экрана, а потом вытащим его обратно. О, ужас! На части окна, побывавшей за границей экрана, линии стерлись! (Рис. 14, б). Причем при использовании объекта Image подобный эффект не наблюдается.
а) | б) |
Рис. 14. Потеря части изображения.
Как бороться с таким безобразием? Увы, единственный способ – перерисовывать картинку всякий раз, когда часть изображения затирается. Для этого вынесем все команды рисования в отдельную процедуру Draw:
procedure Draw;
begin
with Form1.Canvas do
begin
Pen.Color:=clWhite;
Pen.Width:=20;
MoveTo(0,0);
LineTo(Form1.ClientWidth,Form1.ClientHeight);
MoveTo(Form1.ClientWidth,0);
LineTo(0,Form1.ClientHeight)
end
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Draw
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
Draw
end;
В данном фрагменте добавлен обработчик события формы OnPaint. Это событие происходит всякий раз, когда форму надо перерисовывать. Соответственно в такие моменты и вызывается процедура Draw. Теперь с исчезновениями частей изображения покончено.
Построение динамических изображений
Анимация в Delphi создается двумя основными способами. Давайте изобразим звездное небо, по которому летит летающая тарелка. При этом нужно обеспечить автоматическое восстановление фона под движущейся картинкой.