Delphi 画布对象及其简单应用 - ╰★张志峰★╮

TShape组件的属性,事件和方法

TImage组件的属性,事件和方法

Paintbox组件的属性,事件和方法

使用鼠标事件的绘图第 9章 图像图形应用编程

9.1 图形应用编程本章主要是讲解图形图像对象的概念以及如何在程序运行时绘制图形图像等内容,主要是通过一些例子来讲解 Delphi 7.0 对图形图像强大的处理功能。在 Delphi 7.0中,专门定义了一组对象和部件用以绘制图形,完成一些简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用图形;通过设置它们的属性,得到不同风格的图形。另外,通过鼠标事件的定义,可以方便地设计图形绘制程序。

9.1.1 画布对象属性在图形应用编程中,最常用到的是 canvas类,就是常说的画布。它可以将某些组件的表面作为一张画布,允许编程者利用有关的命令在其上任意地作图。很多组件都支持画布这个属性,同时画布本身又是一个对象,它也有自己的属性,但是这些属性必须要在程序执行时才可以来进行设置。常用的属性有以下几个。

( 1)图形像素数组( PixArray)属性

PixArray属性确定用于像素颜色的读取和像素颜色的设置。

( 2)画笔( Pen)属性

Pen属性确定画布用做画线及轮廓线的画笔。

9.1.1 画布对象属性 (1)

( 3)画刷( Brush)属性

Brush属性确定画布用于填充图像及背景色的颜色及图案。

( 4)字体( Font)属性

Font属性确定画布的字体。

1,像素像素是构成图形的最基本的单位,画布上每一个点都有对应的像素,

用来代表构成一个图形的某一点的颜色。像素的处理一般包括像素颜色的读取和像素颜色的设置。最常用的是利用画布的 Pixels属性,来绘制函数曲线。

【 例 9-1】 用 Pixels属性来画 Y=X的函数曲线。

运行后的界面如图 9-1所示。

图 9-1 用像素来画图

主要的功能如下:

单击显示按钮,在屏幕上就可以画出 Y=X的函数图。

主要的程序代码如下:

图 9-1 用像素来画图

9.1.1 画布对象属性 (2)

procedure TForm1.Button1Click(Sender,TObject);

VAR xt,yt,t:integer; //xt,yt是用来决定像素的位置,t用来控制循环次数。

x,y:real; //x,y是用来取得屏幕的中心

begin

x:=form1.ClientWidth/2;

// ClientWidth属性指的是不包括标题栏在内的宽度。

y:=form1.ClientHeight/2;

// ClientHeight属性指的是不包括标题栏在内的高度。

for t:=-10000 to 10000 do

begin

xt:=round(t/100+x);

{t之所以要除以 100是因为要让像素的显示紧密点没有断断续续的感觉,加上 x是因为原来的中心在( 0,0)的地方,也就是画布的左上角,而现在是要移到( x,y)的地方,

将坐标原点进行了移动。 }

yt:=round(-t/100+y);

canvas.Pixels[xt,yt]:=clblue;//画布的像素颜色为蓝色。

end; end;

9.1.1 画布对象属性 (3)

2,画笔画布中的画笔属性是用来控制用户画一条线时的线条形状。画一条线其实就是改变两点间的像素颜色。

画笔本身又包含了四个可以设置的属性:颜色( Color)、宽度( Width)、

风格( Style)和显示模式( Mode)。

( 1)颜色属性( Color)

在了解颜色属性前,先来了解一下 Windows的颜色系统。

以前可能已经听说了一个颜色是多少位的,这是表示所能表达的颜色数多少的指标,是什么意思呢?比如 1位的颜色则表示 2的一次方,即黑或白两种颜色,这种图片很少见。 8位的颜色则表示最多可以有 28=256种颜色,表明一张图片中最多可以有 256种颜色。 24位的图片可以包含 16M位的颜色。比如使窗体的背景色为白色则可以用:

Form1.Color:=RGB(255,255,255);

当然你也可以用数值法来直接表达,如何写呢?在 Delphi 7.0中是在十六进制数前面加 $符号。因为 Windows 98中的颜色系统是 32位的,所以头 8位不用,

用 0来表示。红色可以写成,Form1.Color:=$00FF0000;

注意这里是十六进制数。后 6位每两位代表一个分量( 00-FF),头两位不用。

9.1.1 画布对象属性 (4)

接下来了解画笔的颜色属性,它的缺省值为黑色。如果要将画笔的颜色定义为绿色,那么可以用以下的代码:

canvas.pen.color:=clgreen;

或者是:

canvas.pen.color:=$0000ff00;

( 2)风格属性( Style)

风格属性是用来设置画笔所画的线的类型,默认值为 psSolid(实线),

详见表 9-2。详见本教程 P152页。

属性值说明 PsClear没有线条 PsSolid实线 PsDash虚线 PsDot圆点

PsDashDot点划线 PsDashDotDot双点划线设置画笔的类型可通过如下语句实现,canvas.Pen.Style:=<类型值 >;

例如,canvas.Pen.Style:=psDashDot;就设置了画笔的风格类型为点划线。

( 3)显示模式属性( Mode)

显示模式属性确定画笔是如何画线的,它的取值有以下几种,详见表 9-3。

详见本教程 P153页。

为了便于表达,可以用三个字母来表示颜色,P(画笔的颜色 ),B(画刷的颜色 ),A(背景中已经存在的颜色 )。

9.1.1 画布对象属性 (5)

【 例 9-2】 画两个方形,并且两个方形之间有一个交集,如图 9-2所示 。

图 9-2 pmCopy 属性

主要的代码如下:

procedure TForm1.Button1Click(Sender,TObject);

begin

Canvas.Pen.Width:=3; //边框宽度 3

Canvas.Pen.Color:=clRed; //画笔颜色:红

canvas.Brush.color:=clYellow;//填充色:黄

Canvas.Pen.Mode:=pmCopy;//系统默认的模式,可写可不写

canvas.Rectangle(10,10,300,300);

//画一个矩形,左上角的坐标是( 10,10),右下角的坐标为

( 300,300)

canvas.Rectangle(50,50,340,340);

// 画一个矩形,左上角的坐标是( 50,50),右下角的坐标为

( 340,340)

end;

当把 Canvas.Pen.Mode:=pmCopy;改为 Canvas.Pen.Mode:=pmblack;

它的显示效果如图 9-3所示。

9.1.1 画布对象属性 (6 )

如果把 Canvas.Pen.Mode:=pmCopy;改为 Canvas.Pen.Mode:=pmwhite;

那么图 9-3就变成了白色的了。

如果把 Canvas.Pen.Mode:=pmCopy;改为 Canvas.Pen.Mode:=pmnot,当第一次单击显示按钮的时候,则显示的结果如图 9-4所示。

第二次单击显示按钮的时候,显示结果如图 9-5所示。记住 pmNot是对背景色求反的一种操作。

图 9-3 pmblack

属性 图 9-4 pmnot 属性图 9-5 pmnot

属性

第一次按按钮

A,画第一个方形由于背景色是灰色的 RGB(191,191,191),所以他的反色为 RGB(64,64,64)是一种浅黑色。

9.1.1 画布对象属性 (7 )

B,画第二个方形在没有图像交叉的部分与画第一个方形没什么两样,背景画图处还是灰色的 RGB(191,191,191),所以画出来的还是淡黑色的。

第二次按按钮根据前面讲的外面黑色的部分被反成灰色,而中间的灰色被求了两次反,

还是灰色。如图 9-5所示。

简单地举以上几个例子,其他的属性值自己去尝试一下,你可以看到许多意想不到的效果。

( 4)宽度属性( Width)

表示画笔的粗细程度,单位是像素,默认值为 1,表示为一个像素。设置方式为:

canvas.Pen.Width:=<整型 >;

例如,canvas.Pen.Width:=5;就设置了画笔的宽度为 5个像素。

3,画刷( Brush)

画刷( Brush)属性是用来设置图形内部区域的填充方式。

( 1)颜色( Color)属性颜色属性是来设置画刷的填充区域的颜色,默认情况下是白色。

9.1.1 画布对象属性 (8 )

设置方法为 canvas,brush.color:=<属性值 >。

例如 canvas.brush.color:=clred; 就可以将画刷的颜色设置为红色,常见的颜色值参照表 9-1。详见本教程 P155页。

( 2)风格 (Style)属性风格属性是用来确定图形的填充方式,它的取值见表 9-4。

设置方法为,canvas.brush.style:= <类型值 >;

例如,canvas.brush.style:= bsCross; 就设置了画刷的线条的类型是十字线。

( 3)位图( Bitmap)属性位图属性用来设置一个存放图形数据的对象,可以在程序运行阶段动态地创建或者删除,常用的命令有:

Bitmap.create //创建一个位图对象。

Bitmap.free //释放位图对象。

Bitmap.loadfromfile(‘文件路径’ ) //通过文件路径调入位图,装载在位图对象中。

Bitmap.Draw //在指定的地点按原图的大小显示图形或图像。

9.1.1 画布对象属性 (9 )

【 例 9-3】 位图的创建和释放,主界面如图 9-6所示 。

程序代码如下:

procedure TForm1.Button1Click(Sender,TObject);

var

bitmap1:tbitmap;//定义位图变量

begin

bitmap1:=Tbitmap.Create;//创建位图 bitmap1

bitmap1.LoadFromFile(\'d:\hand.bmp\');//装入图像文件

form1.Canvas.Draw(10,20,bitmap1);//在坐标( 10,20)的地方显示图形。

bitmap1.Free;//释放位图

end;

4,作图区域作图区域 Rect是 Trect属性中的对象,同时它也是一个函数。它的作用就是定义一个矩形区域对象。 Rect对象用两个 Tpoint类型指明区域范围或者用四个整型变量定义区域范围。

图 9-6 位图操作

9.1.1 画布对象属性 (10 )

它的调用如下:

function Rect(ALeft,ATop,ARight,ABottom,Integer),TRect; overload;

function Rect(const ATopLeft,ABottomRight,TPoint),TRect; overload;

Rect常用的方法有:

Rect(x1,y1,x2,y2) //定义 Rect区域范围

Fillrect //用填充色填充 Rect区域

FloodFill //用填充色填充 Rect之外的区域

TextRect //在 Rect对象中显示文本

StretchDraw //把 Bitmap填充到 Rect

【 例 9-4】 Rect对象的方法和属性

运行后界面如图 9-7所示。

(主要代码见本教程 P157 页)

图 9-7 Rect 对象操作

9.1.2 字体 (1)

1,Height字高先来看一个程序界面,如图 9-8所示。

主要的代码如下:

procedure TForm1.Button1Click(Sender,TObject);

begin

Canvas.Font.Height:=-18;

Canvas.TextOut(20,30,\'我的 HEIGHT为 -18\');

Canvas.Font.Height:=18;

Canvas.TextOut(40,60,\'我的 HEIGHT为 18\');

end;

2,Size字号字号对于你来说肯定不会陌生的,在任何字编辑软件中都会使用它。

它的设置一般为 canvas.font.size=<整型值 >; 如 canvas.Font.Size:=10;

3,Name名称属性这个属性中包含了字体的名称:比如宋体、仿宋、楷体 _gb2312等字体的名字。

字体本身也有很多的属性,下面进行简单的介绍。

图 9-8 字体 Height

属性

9.1.2 字体 (2)

4,Style属性字体还有一个 Style的属性,这个属性表示字体是什么类型的。比如,

fsBold(黑体 ),fsItalic(斜体 ),fsUnderline(下划线 ),fsStrikeOut(中划线 )。

它的设置一般为,Canvas.Font.Style:=<类型值 >;

如,Canvas.Font.Style:=[fsBold];注意要用 []

9.1.3 画布对象的方法

1,Moveto方法作用是将画笔移到指定的位置。画笔的当前位置在 PenPos属性中。方法为:

procedure MoveTo(X,Y,Integer);

2,Lineto方法从当前位置画一条线至 (X,Y)所指定的位置,并把笔的位置移至 (X,Y)。

方法为:

procedure LineTo(X,Y,Integer);

9.1.3 画布对象的方法 (1)

3,画折线的方法( Polyline方法)

调用 PolyLine方法,把提供的多个点依次连接起来,画一系列的直线,其语法格式为,Canvas.PolyLine([Point(x1,y1),Point(x2,y2),Point(x3,y3),…]);

4,画矩形的方法( Rectangle方法)

Rectangle方法是在画布上用当前画刷绘制矩形,其语法格式为:

Canvas.Rectangle(X1,Y1,X2,Y2);其中 (x1,y1)是矩形的左上角,(x2,y2)

是矩形的右下角。

5,画圆角矩形的方法( Roundrect)

Roundrect方法是用来画圆角矩形的,其语法格式为:

Canvas.RoundRect(X1,Y1,X2,Y2,X3,Y3);其中 (X1,Y1)为矩形的左上角,

(X2,Y2)为右下角。其中 X3,Y3为圆角的长短半径。

6,画圆或画椭圆的方法( Ellipse方法)

Ellips方法在画布指定的矩形边界上画一个椭圆,其语法格式为:

Canvas.Ellipse(X1,Y1,X2,Y2);其中,(X1,Y1)是矩形左上角的像素坐标,

X2,Y2是矩形右下角的象素坐标。如果矩形形成一个区域,将出现一个椭圆。

如果这个区域是个正方形的话,则为圆。

7,画弧线曲线的方法( Arc方法)

Arc方法是用来画椭圆弧线曲线的,其语法格式为:

9.1.3 画布对象的方法 (2)

Canvas.Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4);其中 (X1,Y1),(X2,Y2)定义矩形,

圆弧以 (X3,Y3)为起点,逆时针到 (X4,Y4)点结束。

8,画多边形方法( Polygon方法)

Polygon方法是用于画由一系列点定义的多边形,其语法格式为:

Canvas.Polygon([Point(x1,y1),Point(x2,y2),Point(x3,y3),…]); 其中 (Xi,Yi)为多边形的顶点。它跟 Polyline方法的区别在于它能自动封闭图形。

9,画饼图的方法( Pie方法)

Pie方法是用来画饼图,其语法格式为:

Canvas.Pie(X1,Y1,X2,Y2,X3,Y3,X4,Y4); Pie方法画由 (X1,Y1)及 (X2,Y2)确定的椭圆,从椭圆的中心经 (X3,Y3)到椭圆的中心经 (X4,Y4)的饼图。

10,画帽图的方法( Chord方法)

Chord方法是用来画帽图的,其语法格式为:

Canvas.Chord(X1,Y1,X2,Y2,X3,Y3,X4,Y4);Chord方法连接椭圆上的两点,

椭圆由 (X1,Y1),(X2,Y3)两点所确定的矩形决定,(X3,Y3)是始点,(X4,Y4)是终点。

9.1.3 画布对象的方法 (3)

【 例 9-5】 画各种曲线的程序,如图 9-9所示 。

图 9-9 各种曲线

主要的程序代码如下:

procedure TForm1.FormPaint(Sender,TObject);

begin

with canvas do

begin

Pen.Color:=clred;//设置画笔颜色

pen.Width:=3;//设置画笔大小

moveto(10,10);

lineto(50,60);

font.Color:=clPurple;

textout(10,60,\'画直线 \');

pen.Color:=clgreen;

polyline([point(100,10),point(120,50),point(140,10),point(160,50),

point(180,10)]);

textout(80,60,\'用 Polyline命令来画折线 \');

pen.Color:=clyellow;

Rectangle(240,10,340,50) ;

Textout(220,60,\'用 Rectangle命令来画矩形 \');

pen.Color:=clMaroon;

9.1.3 画布对象的方法 (4)

Roundrect(400,10,450,60,5,10);

textout(360,60,\'用 Roundrect命令来画圆角矩形 \');

pen.color:=clNavy;

Ellipse(10,100,100,150) ;

textout(10,160,\'用 Ellipse命令来画椭圆 \');

pen.Color:=clPurple;

arc(140,100,240,150,160,110,220,130);

textout(140,160,\'用 arc命令来画圆弧 \');

pen.Color:=clOlive;pie(260,100,360,150,280,140,330,140);

textout(260,160,\'用 pie命令来画饼图 \');

pen.Color:=clFuchsia;chord(380,100,480,150,390,120,450,120);

textout(380,160,\'用 chord命令来画帽图 \');

pen.Color:=clTeal;polygon([point(10,200),point(90,200),point(50,250)]);

textout(10,260,\'用 Polygon命令来画三角形 \');

pen.Color:=clAqua;

polyline([point(160,200),point(240,200),point(200,250),point(160,

200)]);//注意和 Polygon命令的区别

textout(160,260,\'用 Polyline命令来画三角形 \');

end;end;

9.1.3 画布对象的方法 (5)

主要程序代码

procedure TForm1.FormPaint(Sender,TObject);

var

i:integer;

str1:string;

begin

for i:=0 to 255 do

begin

with canvas do

begin

pen.Color:=rgb(i,i,i);//指定画笔颜色

moveto(0,i);

lineto(form1.ClientWidth,i);

end;

end;

with canvas do

【 例 9-6】 将窗体背景颜色由深变浅显示,如图 9-10所示。

图 9-10 颜色变化

9.1.3 画布对象的方法 (6)

begin

brush.style:=bsclear;

font.Color:=clwhite;

font.Size:=15;

font.Style:=[fsbold];

str1:=\'上深下浅的窗体背景 \' ;

textout(30,40,\'上深下浅的窗体背景 \');

end;

end;

【 例 9-7】 程序功能:当在界面上任意单击时,屏幕上产生一个随机大小颜色的矩形,里面有一个椭圆。实现后的界面如图 9-11所示。

图 9-11 随机产生

首先定义一个过程 star,它的功能是画出随机大小颜色的矩形。主要的程序代码如下:

procedure star(a,b:integer);

var x,y:integer;

9.1.3 画布对象的方法 (7)

c,d:tcolor;//定义颜色变量

point1,point2:tpoint;

rect1:trect;

begin

x:=random(form1.ClientWidth);//取得一个随机值

y:=random(form1.ClientHeight);

c:=random($00ffffff);//取得一种随机颜色

d:= random($00ffffff);

form1.Canvas.Pen.Color:=c;//设置画笔的颜色

form1.Canvas.Pen.Width:=3;//设置画笔的线宽

point1:=point(x-a,y-b);//矩形左上角的坐标

point2:=point(x+a,y+b);//矩形右上角的坐标

rect1:=rect(point1,point2);

form1.Canvas.rectangle(rect1);//画矩形

form1.Canvas.Pen.Color:=d;//设置画椭圆的画笔的颜色

form1.Canvas.Pen.Width:=1;//设置画椭圆的画笔的线宽

form1.Canvas.Brush.Color:=d ;//设置画椭圆的填充色

form1.Canvas.Ellipse(rect1);//画椭圆

form1.canvas.Brush.Style:=bsclear;//取消填充色

end;

9.1.3 画布对象的方法 (8)

procedure TForm1.FormClick(Sender,TObject);

begin

randomize;

star(random(50),random(50));

end;

可以看到在画图形的时候,先前的那个图形并没有被擦除掉,因而窗体不久就会变得混乱不堪。该怎样来解决这个问题呢?只要在图形显示代码中加入

rerfesh方法来刷新图形显示就可以了。

【 例 9-8】 阴影的制作,主要界面如图 9-12所示。

图 9-12 阴影的制作这个按钮就有了一个阴影效果,其实只要根据这个按钮的 Top,Left,Width,Height等属性,确定要绘制直线的起点和终点就可以了。

主要的程序代码如下:

procedure TForm1.FormPaint(Sender,TObject);

var

i,m,n:integer;

begin

9.1.3 画布对象的方法 (9)

m:=0; n:=0;

form1.Canvas.Pen.Width:=2;

for i:=0 to 4 do

begin

with form1.Canvas do

begin

pen.Color:=$00a0a0a0;

moveto(button1.Left+button1.Width+m,button1.Top+n);

//起始点为右上角。

lineto(button1.Left+button1.Width+m,button1.Top+button1.

height+n); //终点是右下角。

pen.Color:=$00606060;

moveto(button1.Left+m,button1.Height+button1.Top+n);

//起始点为左下角

lineto(button1.Left+button1.Width+m,button1.Height+button1.

Top+n); //终点为右下角。

m:=m+1; n:=n+1;

end; end;end;

9.2 图像组件的介绍和使用

Shape组件在工具栏 Additional中,如图 9-13所示 。 用来绘制简单的几何图形,如矩形,圆,椭圆,等等 。

Delphi 7.0为用户提供了图像组件,这一节主要是讲这些组件的使用 。

9.2.1 Shape组件图 9-13 Shape 控件

1,Shape组件的属性

Shape组件和 Canvas对象一样,主要属性有 Brush 画笔属性,Pen 画笔属性,Shape属性。 Brush 画笔属性和 Pen 画笔属性跟前面讲的差不多,

就不在累述了。接下来主要介绍 Shape属性。

Shape属性是形状组件最重要的属性,它决定形状组件的形状。取值如表 9-5所示。详见本教程 P166页。

9.2.1 Shape组件

【 例 9-9】 Shape组件使用。

在屏幕上放上 6个 shape组件,然后输入以下代码:

procedure TForm1.FormCreate(Sender,TObject);

begin

shape1.Shape:=stcircle;//圆形

shape1.Pen.Color:=clred;//画笔颜色

shape1.Pen.Style:=psdash;//画笔类型为虚线

shape1.Pen.Width:=3;//画笔粗细

shape1.Brush.Color:=clgreen;//画刷颜色

shape1.Brush.Style:=bscross;//画笔类型为十字交叉

shape2.Shape:=stellipse;//椭圆

shape2.Brush.Style:=bsvertical;//垂直线

shape3.Shape:=strectangle;//矩形

shape4.Shape:=stroundrect;//圆角矩形

shape5.Shape:=stsquare;//正方形

shape6.Shape:=stroundsquare;//圆角正方形

end;

运行结果如图 9-14所示。

图 9-14 shape 形状

9.2.2 Image组件 (1)

图像组件 Timage在工具栏 Additional中,如图 9-15所示 。

图 9-15 Image 组件它是一种容器控件,在应用程序的窗体上提供了一个矩形区域。 Image对象是建立在 Bitmap,Icon,Picture等对象的基础上,用于显示图片(扩展名为,bmp,.ico,.wmf,.jpg的文件)。它的一个重要属性是 picture属性,这个属性是调入显示的图片。

【 例 9-10】 Image组件的使用。这个程序主要实现的功能:单击两个调入按钮来载入不同的图画,也可以单击保存按钮来保存图画。运行时的界面如图 9-16

所示。

图 9-16 Image控件的使用

9.2.2 Image组件 (2)

1,主要操作步骤

在 form1中放三个 Tbutton 组件和一个 Timage组件;

分别设置三个 Tbtton的 Caption属性如图 9-16所示。

2,主要程序代码

procedure TForm1.Button1Click(Sender,TObject);

begin

image1.Picture.LoadFromFile(\'C:\Program Files\Common Files\

Borland Shared\Images\Splash\256Color\handshak.bmp\');

//调入图像

end;

procedure TForm1.Button2Click(Sender,TObject);

begin

image1.Picture.LoadFromFile(\'C:\Program Files\Common Files\

Borland Shared\Images\Splash\256Color\CHEMICAL.bmp\');

end;

procedure TForm1.Button3Click(Sender,TObject);

9.2.2 Image组件 (3)

begin

image1.Picture.SaveToFile(\'d:\pg.bmp\');

//用 savetofiel方法来保存图像

end;

程序运行过程中调入的图片只能显示出一角,不能显示出整张图片,该怎么来解决这个问题呢?一种方法是:设置 Image组件的 AutoSize的属性为 True,

这个 Image组件就可以自动调节来适应图像的大小。另一种方法是:设置

Image组件的 Stretch属性,如果把 Stretch属性设置为 True,表示图像会自动地放大或者缩小使得和 Image组件的大小一样。如果 Image的大小发生变化,则图像的大小也随着变化,如果设置为 False,则图像会按照原来的大小显示出来。

注意,对于 Image组件中的 Picture对象,loadfromfile和 SaveTofile是最常用的两个方法。

9.2.2 Image组件 (4)

【 例 9-11】 Autosize属性和 Stretch属性,运行界面如图 9-17所示 。

图 9-17 Autosize属性和 Stretch属性

主要的程序代码如下:

{在 FormCreate中调入图画}

procedure TForm1.FormCreate(Sender,TObject);

begin

image1.Picture.LoadFromFile(\'C:\Program Files\Common Files\

Borland Shared\Images\Splash\256Color\handshak.bmp\');;

image2.Picture.LoadFromFile(\'C:\Program Files\Common Files\

Borland Shared\Images\Splash\256Color\handshak.bmp\');

image3.Picture.LoadFromFile(\'C:\Program Files\Common Files\

Borland Shared\Images\Splash\256Color\handshak.bmp\');

end;

9.2.2 Image组件 (5)

procedure TForm1.CheckBox2Click(Sender,TObject);

begin

image2.Stretch:=checkbox2.Checked;

//选择 checkbox2,把 image2的 stretch属性设置为 true

end;

procedure TForm1.CheckBox1Click(Sender,TObject);

begin

image1.AutoSize:=checkbox1.Checked;

//选择 checkbox1,把 image1的 autosize属性设置为 true;

end;

就可以看到图片完整地显示出来了。要注意的是,如果同时设置 Autosize和

Stretch属性为 True,那么先响应 Autosize的属性。

9.2.3 Paintbox组件 (1)

Paintbox组件主要提供一个可以用来绘制几何图形的矩形区域,可以使用绘图语句在这个区域内绘制各种图形。 Paintbox的绘图方式与 Form等其他绘图组件基本上一样,都是通过 Canvas对象来完成的。所不同的是绘制的坐标是以 Paintbox对象的左上角为原点,而不是以窗体的左上角为原点,且当设定的背景色与 Form相同的时候,其运行的结果和在窗体上绘图的效果一样。

使用 Paintbox组件绘图的一个好处是只需将图形画在 Paintbox组件上面,这样就可以避免计算坐标原点了。

画板组件 Paintbox在 System页中,如图 9-18所示 。

图 9-18 Paintbox组件

【 例 9-12】 输入圆的坐标和半径求圆的面积和周长,如图 9-19所示。

图 9-19 paintbox组件的使用

9.2.3 Paintbox组件 (2)

1,主要步骤

在 form1上添加 6个 Tlabel组件,它们的 Caption属性如图 9-19所设置。

在 form1添加 5个 Tedit组件,并且把它们的 Text属性设置为 0。设置

edit4,edit5的 Readonly属性为 True。

在 form1中添加一个 TPaintbox组件,设置它的 Align属性为 alLeft。

在 form1中添加一个 TButton组件,设置它的 Caption属性为计算。

2,主要程序代码

public

{ Public declarations }

x,y:integer;//定义公共变量,x,y是为了取得 Paintbox1的中点

end;

var

Form1,TForm1;

implementation

{$R *.dfm}{下面代码是为了画坐标轴}

procedure TForm1.FormPaint(Sender,TObject);

Var i:integer;//定义 I变量是为了控制循环

9.2.3 Paintbox组件 (3)begin

paintbox1.Canvas.Pen.color:=clblue;//定义画笔颜色

paintbox1.Canvas.Brush.Style:=bsclear;

x:=round(paintbox1.ClientWidth/2);//取得 x方向的中点

y:=round(paintbox1.ClientHeight/2);//取得 y方向的中点

paintbox1.Canvas.MoveTo(x,0);

paintbox1.Canvas.LineTo(x,paintbox1.Height);//画 y轴

paintbox1.Canvas.MoveTo(0,y);

paintbox1.Canvas.LineTo(paintbox1.Width,y);//画 x轴

{下面的循环是为了输出坐标轴上的坐标和数值}

for i:=-15 to 15 do

begin

if i<>0 then

begin

paintbox1.Canvas.Moveto(x+i*20,y);

paintbox1.Canvas.LineTo(x+i*20,y-5);

//画出 x方向上的坐标,乘以 20只不过是为了在 x方向上的坐标有一些间距。

paintbox1.Canvas.TextOut(x+i*20,y+5,inttostr(i));

//画出 x方向上的数值

paintbox1.Canvas.MoveTo(x,y+i*20);

paintbox1.Canvas.LineTo(x+5,y+i*20);

//画出 y方向的坐标

9.2.3 Paintbox组件 (4)

paintbox1.Canvas.Textout(x-15,y+i*20,inttostr(-i));

//画出 y方向上的数值

end;

end;

end;

{下面的程序段是为了画圆和求出圆的面积和周长}

procedure TForm1.Button1Click(Sender,TObject);

var c,s:real;//c代表圆周长,s代表圆面积

a,b,r:integer;//a,b代表圆中心,r表示圆半径

begin

refresh;//主要是为了去掉上一次所画的圆

a:=strtoint(edit1.Text);

b:=strtoint(edit2.Text);

r:=strtoint(edit3.Text);

paintbox1.Canvas.Ellipse(x+(a-r)*20,y+(b-r)*20,x+(a+r)*20,y+(b+r)*20);

//画出圆

s:=3.14159*r*r;

c:=2*3.14159*r;

edit4.Text:=floattostr(c); //求出圆周长

edit5.Text:=floattostr(s); //求出圆面积

end;

9.3 使用鼠标绘图 (1)

鼠标常被用做绘图的工具,应用程序利用鼠标位置的变化来绘制各种不同的图形 。 鼠标有三个动作:鼠标按钮按下,鼠标移动,鼠标按钮弹起 。 在

Delphi 7.0 中,对应三个动作有三个不同的事件,OnMouseDown,

OnMouseMove,OnMouseUp。

当 Delphi 7.0应用程序探测到一个鼠标动作时,它传递 5个参数,并调用相应的事件响应。

程序员可利用这些参数来定义事件程序。 5个参数如表 9-6所示。详见本教程 P172页。

【 例 9-13】 鼠标事件的应用。实现的功能:只要在屏幕上单击就可以画出一条直线和写出“欢迎你的到来”的话。界面如图 9-20所示。

(图 9-20 鼠标事件 )

9.3 使用鼠标绘图 (2)

程序代码如下:

{在 FormMouseDown的事件中写入代码,也就是在 form1中单击就可以激活

MouseDown事件}

procedure TForm1.FormMouseDown(Sender,TObject; Button,TMouseButton;

Shift,TShiftState; X,Y,Integer);

begin

form1.Canvas.Pen.Width:=3;

form1.Canvas.Pen.Color:=clred;

form1.Canvas.MoveTo(10,20);

form1.Canvas.LineTo(x,y);

form1.Canvas.TextOut(x,y,\'欢迎你的到来 \');

end;

上面的代码应该都看的懂,如果不想把起始点定义在( 10,20)这一点,而是当按下鼠标以后,开始画线,当放开鼠标的时候,就停止画线。用如下代码就可以实现:

{在 MouseDown事件的事件中来定义画线的起点}

procedure TForm1.FormMouseDown(Sender,TObject; Button:

9.3 使用鼠标绘图 (3)

TMouseButton; Shift,

TShiftState; X,Y,Integer);

begin

form1.Canvas.MoveTo(x,y);

//定义起点,其中( x,y)为在屏幕上单击时的坐标

end;

{在 MouseUp事件中定义画直线事件,该事件指的是当用户放开鼠标所产生的事件}

procedure TForm1.FormMouseUp(Sender,TObject; Button,TMouseButton;

Shift,

TShiftState; X,Y,Integer);

begin

form1.Canvas.LineTo(x,y);//(x,y)为放开鼠标时的坐标。

end;

用以上代码就可以画出从任意位置开始到任意结束点之间的直线。但是在这个程序中看不到画线的过程,只是当放开鼠标的时候,一条直线就画好了。怎样才可以在移动鼠标时就可以看到所画图形的形状?就要用到

MouseMove事件,该事件指的是当移动鼠标所发生的事件。在 MouseMove

9.3 使用鼠标绘图 (4)

事件中输入以下代码,

procedure TForm1.FormMouseMove(Sender,TObject; Shift,TShiftState; X,

Y,Integer);

begin

form1.Canvas.LineTo(x,y);

//当移动鼠标时,它就画从起点到移动点的直线。

end;

通过这段代码就又会发现以下问题:

画线不能停止,鼠标在界面上移动也就在不停地画线,没办法停止画线;

不能绘制光滑的直线或取消。原因是在每次移动鼠标的时候,程序使用

LineTo方法来画线,因此直线的起点每次都在不停地变化,就不可能画出光滑的直线等。

那如何来解决上述两个问题呢?

对于第一个问题,可以设置一个条件,满足条件开始画线;不满足条件就停止画线。

对于第二个问题,可以用固定起始点的方法来解决。绘制直线完整的代码本教程 P173页所示。