第9章图像图形应用编程 本章要点: 画布对象及其应用 USHape组件的属性、事件和方法 区 rImage组件的属性、事件和方法 pAintbox组件的属性、事件和方法 区使用鼠标事件的绘图
本章要点: 画布对象及其应用 TShape组件的属性、事件和方法 TImage组件的属性、事件和方法 Paintbox组件的属性、事件和方法 使用鼠标事件的绘图 第9章 图像图形应用编程
91图形应用编程 本章主要是讲解图形图像对象的概念以及如何在程序运行时绘制图形图 像等内容,主要是通过一些例子来讲解 Delphi70对图形图像强大的处理功 能。在 Delphi7.0中,专门定义了一组对象和部件用以绘制图形,完成一些 简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用 图形;通过设置它们的属性,得到不同风格的图形。另外,通过鼠标事件 的定义,可以方便地设计图形绘制程序。 9.1.1画布对象属性 在图形应用编程中,最常用到的是 canvas类,就是常说的画布。它可以 将某些组件的表面作为一张画布,允许编程者利用有关的命令在其上任意地作 图。很多组件都支持画布这个属性,同时画布本身又是一个对象,它也有自己 的属性,但是这些属性必须要在程序执行时才可以来进行设置。常用的属性有 以下几个。 (1)图形像素数组( PiXArray)属性 PiXArray属性确定用于像素颜色的读取和像素颜色的设置。 (2)画笔(Pen)属性 Pen属性确定画布用做画线及轮廓线的画笔 Inprise Dephi
9.1 图形应用编程 本章主要是讲解图形图像对象的概念以及如何在程序运行时绘制图形图 像等内容,主要是通过一些例子来讲解Delphi 7.0 对图形图像强大的处理功 能。在Delphi 7.0中,专门定义了一组对象和部件用以绘制图形,完成一些 简单的图像功能。利用这些对象、部件的方法,可以方便地绘制各种常用 图形;通过设置它们的属性,得到不同风格的图形。另外,通过鼠标事件 的定义,可以方便地设计图形绘制程序。 9.1.1 画布对象属性 在图形应用编程中,最常用到的是canvas类,就是常说的画布。它可以 将某些组件的表面作为一张画布,允许编程者利用有关的命令在其上任意地作 图。很多组件都支持画布这个属性,同时画布本身又是一个对象,它也有自己 的属性,但是这些属性必须要在程序执行时才可以来进行设置。常用的属性有 以下几个。 (1)图形像素数组(PixArray)属性 PixArray属性确定用于像素颜色的读取和像素颜色的设置。 (2)画笔(Pen)属性 Pen属性确定画布用做画线及轮廓线的画笔
911画布对象属性(1) (3)画刷( Brush)属性 Brush属性确定画布用于填充图像及背景色的颜色及图案。 (4)字体(Font)属性 Font属性确定画布的字体。 1.像素 像素是构成图形的最基本的单位,画布上每一个点都有对应的像素, 用来代表构成一个图形的某一点的颜色。像素的处理一般包括像素颜色的 读取和像素颜色的设置。最常用的是利用画布的Pⅸels属性,来绘制函数 曲线 【例9-1】用 Pixels属性来画Y=X的函数曲线 运行后的界面如图9-1所示。 图9-1用像素来画图 主要的功能如下 单击显示按钮,在屏幕上就可以画出¥X的函数图。 图9-1用像素 主要的程序代码如下 来画图 Inprise Dephi
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 用像素 来画图
911画布对象属性(2) procedure TForm1. Button1Click(sender: TObject VAR Xt,yt, t: integer;xt,yt是用来决定像素的位置,t用来控制循环次数。 x, y: real;∥xy是用来取得屏幕的中心 begin x:=form1. ClientWidth/2 ∥ ClientWidth属性指的是不包括标题栏在内的宽度。 y: =form1. ClientHeight/2 ∥ ClientHeight属性指的是不包括标题栏在内的高度 fort:=-10000to10000do begin xt:=≡ round(f100+X) {t之所以要除以100是因为要让像素的显示紧密点没有断断续续的感觉,加上x是 因为原来的中 心在(0,0)的地方,也就是画布的左上角,而现在是要移到(xy)的地方, 将坐标原点进行了 移动。} yt: =round (-t/100+y) canvas.Pixels[Xt, yt]:cbue;/画布的像素颜色为蓝色 end: end norse Dephi
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;
911画布对象属性(3) 2.画笔 画布中的画笔属性是用来控制用户画一条线时的线条形状。画一条线其 实就是改变两点间的像素颜色。 画笔本身又包含了四个可以设置的属性:颜色( Color)、宽度( Width) 风格( Style)和显示模式(Mode)。 (1)颜色属性( Color) 在了解颜色属性前,先来了解一下 Windows的颜色系统。 以前可能已经听说了一个颜色是多少位的,这是表示所能表达的颜色数多 少的指标,是什么意思呢?比如1位的颜色则表示2的一次方,即黑或白两种颜 色,这种图片很少见。8位的颜色则表示最多可以有28=256种颜色,表明一张 图片中最多可以有256种颜色。24位的图片可以包含16M位的颜色。比如使窗 体的背景色为白色则可以用: Form1. Color:=RGB(255,255,255); 当然你也可以用数值法来直接表达,如何写呢?在 Delph7.0中是在十六进 制数前面加$符号。因为 Windows98中的颜色系统是32位的,所以头8位不用, 用0来表示。红色可以写成:Form1colo:=$00FF0000 注意这里是十六进制数。后6位每两位代表一个分量(00-FF),头两位不用 Inprise Dephi
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),头两位不用
911画布对象属性(4) 接下来了解画笔的颜色属性,它的缺省值为黑色。如果要将画笔的颜色 定义为绿色,那么可以用以下的代码: canvas. pen color: =cigreen 或者是: canvas. pen color: =$ooooff00 (2)风格属性( Style) 风格属性是用来设置画笔所画的线的类型,默认值为 ps Solid(实线), 详见表9-2。详见本教程P152页。 属性值说明 Ps Clear没有线条 Ps Solid实线 Ps Dash虚线PsDo圆点 Ps DashDot点划线 Ps DashDotDof双点划线设置画笔的类型可通过如下语句实 现: canvas.Pen.Stye:三 例如: canvas. Pen Style:= psDashDot;就设置了画笔的风格类型为点划线 (3)显示模式属性(Mode) 显示模式属性确定画笔是如何画线的,它的取值有以下几种,详见表9-3。 详见本教程P153页 为了便于表达,可以用三个字母来表示颜色:P(画笔的颜色),B(画刷的 颜色),A(背景中已经存在的颜色)。 Inprise Dephi
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(背景中已经存在的颜色)
911画布对象属性(5) 【例92】画两个方形,并且两个方形之间有一个交集,如图92所示。 主要的代码如下 procedure TForm1. Button 1Click(Sender: TObject) begin Canvas. Pen width:=3;∥边框宽度3 Canvas. Pen color:=cRed;/画笔颜色:红 canvas. Brush. color:= chEllow,填充色:黄 Canvas Pen. Mode:= pmCopy/系统默认的模式,可写可9 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所示。 Inprise Dephi
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所示
911画布对象属性(6) 图93pmb|ack 图94 pinot 图95 pinot 属性 属性 属性 如果把 Canvas Pen. Mode:= pmCopy;改为 Canvas. Pen Mode:= pmwhite; 那么图9-3就变成了白色的了。 如果把 Canvas. Pen. Mode:= pmCopy;改为 Canvas. Pen Mode:= pinot,当第 次单击显示按钮的时候,则显示的结果如图94所示 第二次单击显示按钮的时候,显示结果如图9-5所示。记住 piNot是对 背景色求反的一种操作。 ③第一次按按钮 A.画第一个方形 由于背景色是灰色的RGB(191,191,191),所以他的反色为RGB(64,64,64)是 种浅黑色 Inprise Dephi
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)是 一种浅黑色
911画布对象属性(7) B.画第二个方形 在没有图像交叉的部分与画第一个方形没什么两样,背景画图处 还是灰色的RGB(191,191,191),所以画出来的还是淡黑色的。 ③第二次按按钮 根据前面讲的外面黑色的部分被反成灰色,而中间的灰色被求了两次 还是灰色。如图9-5所示 简单地举以上几个例子,其他的属性值自己去尝试一下,你可以看到 多意想不到的效果。 (4)宽度属性( Width) 表示画笔的粗细程度,单位是像素,默认值为1,表示为一个像素。设置方 式为: canvas. Pen, width:=; 例如: canvas Pen Width:=5;就设置了画笔的宽度为5个像素 3.画刷( Brush) 画刷( Brush)属性是用来设置图形内部区域的填充方式 (1)颜色( Color)属性 颜色属性是来设置画刷的填充区域的颜色,默认情况下是白色 Inprise Dephi
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)属性 颜色属性是来设置画刷的填充区域的颜色,默认情况下是白色
911画布对象属性(8) 设置方法为 canvas. brush colo:=。 例如 canvas. brush color:= clred;就可以将画刷的颜色设置为红色.常见 的颜色值参照表9-1。详见本教程P155页 (2)风格( Style)属性 风格属性是用来确定图形的填充方式,它的取值见表9-4 设置方法为: canvas. brush.stye:= 例如: canvas. brush style:= bsCross;就设置了画刷的线条的类型是十 字线 (3)位图( Bitmap)属性 位图属性用来设置一个存放图形数据的对象,可以在程序运行阶段 动态地创建或者删除,常用的命令有: Bitmap. create∥)创建一个位图对象。 Bitmap. free∥放位图对象。 Bitmap loadfromfile(文件路径’)∥)通过文件路径调入位图,装载在位图 对象中。 Bitmap Draw∥在指定的地点按原图的大小显示图形或图像 Inprise Dephi
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 //在指定的地点按原图的大小显示图形或图像