Delphi 图形设计(2)
10.2 图 形 设 计
Windows是一个基于图形用户界面的操作系统。
若要在窗口上作图,需要调用Windows 提供的应用程序接口(Application Program Inte易做图ce,API),还要申请和维护句柄等资源。
Delphi将这一切都封装在TCanvas类中,通过设置TCanvas类中的属性,调用其中的方法,就可以实现画图功能。
10.2.1 Canvas画布对象
虽然在任何组件上都可以绘制图形,但由于很多组件上都有标题之类的文字,所以通常在窗体或面板之类的容器上绘制图形。
例如,最常用的画图容器为Form和PaintBox。这些容器的空白区域称为画布(Canvas),使用画布类TCanvas的方法可在画布上绘制直线、弧线、矩形或圆形等各种图形。
Canvas是TCanvas类的一个系统定义对象,称为画布对象,通常作为其他控件的一个属性出现,不单独使用。每个控件都有Canvas属性。例如,使用Form的Canvas属性即可在窗体的工作区内绘图。由于Canvas是运行时属性,在程序运行时才能获得,所以必须写程序来完成设置。
Canvas的主要属性有Pen、Brush、Pixels、PenPos等,用于定义绘制图形的风格。
1.Pen画笔
Pen画笔用于控制线条的颜色、模式、风格及宽度。
Pen的类型为TPen类,属性有Color、Mode、Style及Width。
· Color属性:控制线条的颜色。
· Mode属性:控制线条的模式,取值见表10-2。
表10-2 Canvas.Pen.Mode属性取值
值
含 义
pmBlack
总为黑色
pmWhite
总为白色
pmNop
不改变
pmNot
画布背景的相反色
pmCopy
用Color属性指定的画笔颜色
pmNotCopy
画笔颜色的相反色
pmMerge
画笔颜色与画布背景色的合成颜色
pmXor
画笔颜色与画布背景色的异或合成颜色
pmNotXor
pmXor的相反色
· Style属性:控制线条的风格,包括实线、虚线和点划线等,取值见表10-3。
表10-3 Canvas.Pen.Style属性取值
值
含 义
值
含 义
psSolid
实线
psDashDotDot
两点一划线
psDash
短划线
psClear
不划线,通常用于清除轮廓线
psDot
点线
psInsideFrame
实线,Width属性大于1时
psDashDot
点划线
· Width属性:控制线条的宽度。
Width属性的值为整型,如果所给的值小于1,则按1处理。注意,Width属性值会影响Style属性值,当Width属性值不是1时,Style属性值不能是PsDash或PsDashDot。 例如:
Form1.Canvas.Pen.Color:=clRed; //设置线条颜色为白色
Form1.Canvas.Pen.Style:=psDashDot; //设置线风格为点划线
Form1.Canvas.Pen.Width:=1; //设置线宽度为1,即细线
2.Brush刷子
Brush刷子用于确定图形填充的颜色及填充方式。
Brush类型为TBrush类,属性有Color、Style。
· Color属性:确定图形的填充颜色。
· Style属性:确定图形的填充方式,取值见表10-4。
例如:
Form1.Canvas.Brush.Color:=clRed; //设置填充色为红色
Form1.Canvas.Brush.Style:=bsSolid; //设置填充方式为实填充
一般情况下,Brush为矩形、圆或多边形提供内部的填充色和填充图案,还为文本提供背景色,但它不影响线条的颜色和文本的前景色。
表10-4 Canvas.Brush.Style属性取值
取 值
含 义
取 值
含 义
bsSolid
实填充
bsCross
十字交叉线填充
bsClear
不填充
bsDiagCross
交叉线填充
bsBDiagonal
右斜线填充
bsHorizontal
水平线填充
bsFDiagonal
左斜线填充
bsVertical
垂直线填充
3.Pixels像素
Pixels属性用于存储Canvas中每个像素点的颜色值。定义如下:
property Pixels(x,y;integer):TColor;
Pixels是一个二维数组,下标表示某像素点在屏幕位置的坐标,元素类型是TColor。一个绘图过程实际上就是改变画布上有关像素点颜色的过程,从而在视觉效果上得到一幅特定的图。例如:
Form1.Canvas.Pixels[100,200]:=clYellow; //将窗口内的一点涂上黄色
反之,读取Pixels数组的元素值则可取得相应坐标点的颜色值。
4.PenPos画笔位置
PenPos属性表示当前画笔的位置,类型为TPoint。例如:
i:=Form1.Canvas.PenPos.x; //获得当前画笔位置
j:=Form1.Canvas.PenPos.y;
10.2.2 绘图方法
TCanvas类提供多种用于绘图和文字输出的方法。
1.绘图的坐标体系
在组件上绘图的坐标体系与屏幕、窗口相同。
水平方向是X轴,垂直方向是Y轴,左上角起始点坐标是(0,0),区域内任意一点的坐标用(x,y) 表示,右下角点的坐标值取决于屏幕分辨率,例如,屏幕分辨率为800×600,则右下角点的坐标为(799,599)。
2.绘制直线
MoveTo(x,y)将画笔当前位置设置到点(x,y) 处。画笔当前位置在PenPos属性中,改变画笔当前位置使用MoveTo方法,而不要设法改变PenPos的值。
LineTo(x,y)从当前位置至(x,y) 点画一条线,并把画笔当前位置移至(x,y) 处。所绘直线具有已定义Pen画笔的各项属性。例如:
Canvas.MoveTo(x1,y1); //定位(x1,y1)
Canvas.LineTo(x2,y2); //在(x1,y1)和(x2,y2)之间画线
3.绘制矩形
Rectangle方法用当前的Pen和Brush属性绘制一个矩形,声明如下:
procedure Rectangle(x1,y1,x2,y2:integer);
其中,(x1,y1) 和(x2,y2) 分别表示矩形左上角和右下角两点坐标。若|x2 - x1|=|y2 - y1|,则该矩形成为正方形。
4.绘制椭圆
Ellipse方法在指定的矩形内画一个椭圆,声明如下:
procedure Ellipse(x1,y1,x2,y2:integer);
其中,(x1,y1) 和(x2,y2) 分别表示矩形左上角和右下角两点坐标。如果指定矩形为正方形时,椭圆就成为圆。
5.填充多边形
Polygon方法用当前Pen和Brush属性绘制并填充任意边数的多边形,声明如下:
procedure Polygon(Points:array of TPoint);
多边形的多个坐标点存储在数组Points中,Points数组的实际长度决定多边形的边数。一个可填充的多边形应是封闭的,即首尾两点坐标一致。
Points数组元素为TPoint,表示一个点的坐标。TPoint声明如下:
type
TPoint = packed record
X: Longint;
Y: Longint;
end;
Types单元的Point函数将两个整型值生成一个TPoint对象。Point函数声明如下:
function Point(AX,AY:Integer):TPoint;
例如,下列程序段在矩形(x1 , y1 , x2 , y2)范围内画出一个等腰三角形。
var p:array [0..3] of TPoint;
p[0]:=point(x1 +(x2-x1) div 2,y1);
p[1]:=point(x1,y2);
p[2]:=point(x2,y2);
p[3]:=p[0];
Canvas.Polygon(p);
6.显示字符串
Textout方法用当前Font属性在指定位置(x,y)显示指定字符串Text,声明如下:
procedure TextOut(x,y;integer;const Text:string);
10.2.3 窗口绘图事件
在Windows中运行应用程序,窗口的基本操作由Windows控制执行。
当窗口启动时,Windows需要绘制窗口上全部的图形图像;当一个窗口被其他窗口覆盖后再被激活时,Windows需要重新绘制该窗口上曾被覆盖部分的图形图像。例
补充:软件开发 , Delphi ,