第3章 图形与多媒体处理实例

实例49 跳跃的曲线

    

本实例将介绍如何绘制一个会跳跃的曲线。

向窗体上添加一个TImage组件和一个TTImer组件,在程序运行的过程中,TTimage组件上会有一个椭圆不停地跳跃和变化。添加组件后的窗体如图3-8所示。

3-8  添加组件后的窗体

程序首先定义4Integer类型的全局变量——X1,X2,Y1,Y2,它们用于存储上一个时间循环中椭圆的左上角和右下角的坐标。

然后在程序的初始化过程中添加self.Canvas.Brush.Style:=bsClear语句,这样绘制出来的椭圆除了边框之外不会遮挡后面的绘图区。

最后添加TTimer组件响应代码如下:

procedure TForm1.Timer1Timer(Sender: TObject);

begin

    Image1.Canvas.Pen.Mode:=pmNotXor;

    Image1.Canvas.Ellipse(X1,Y1,X2,Y2);

    X1:=Random(Image1.Width);

    X2:=Random(Image1.Width);

    Y1:=Random(Image1.Height);

    Y2:=Random(Image1.Height);

    Image1.Canvas.Pen.Mode:=pmCopy;

    Image1.Canvas.Ellipse(X1,Y1,X2,Y2);

end;

窗体上的TTimer组件的Interval属性设置为1000这样没有1000毫秒就会激活上面的响应过程。程序首先通过pmNotXor的方式擦除掉前一个时间循环中绘制的椭圆。然后利用随机数产生了新的椭圆的坐标。最后用pmCopy的方式在新的坐标点上绘制椭圆,从而产生跳跃的效果。

程序代码如下:

unit Unit1;

interface

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, ExtCtrls, math;

 

type

  TForm1 = class(TForm)

    Timer1: TTimer;

    Image1: TImage;

    procedure FormCreate(Sender: TObject);

    procedure Timer1Timer(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

  X1,X2,Y1,Y2:Integer;

 

implementation

{$R *.dfm}

 

procedure TForm1.FormCreate(Sender: TObject);

begin

    Randomize();

    self.Canvas.Brush.Style:=bsClear;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

begin

    Image1.Canvas.Pen.Mode:=pmNotXor;

    Image1.Canvas.Ellipse(X1,Y1,X2,Y2);

    X1:=Random(Image1.Width);

    X2:=Random(Image1.Width);

    Y1:=Random(Image1.Height);

    Y2:=Random(Image1.Height);

    Image1.Canvas.Pen.Mode:=pmCopy;

    Image1.Canvas.Ellipse(X1,Y1,X2,Y2);

end;

 

end.

保存文件,然后按F9键运行程序。在程序运行过程中,会有一个椭圆不停地变换大小和位置,运行结果如图3-9所示。

3-9  程序运行结果

通过本例读者可以了解到,通过设置Pen对象的Mode属性,在绘图操作中不但可以绘制新的图形,还可以擦除旧的图形。当然,由于本实例中TTImage组件的背景色是白色,所以Pen对象的Mode属性设置为pmNotXor可以擦除旧的图形,如果TTImage组件的背景色是黑色,那么Pen对象的Mode属性设置为pmXor才可以擦除旧的图形。