用DELPHI中Canvas特性开发图形软件

2008-04-09 04:17:46来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

  以往开发Windows图形软件大多用 VC ++ 作为开发工具, VC++强大的图形功能可以让程序员编制出许多优秀的与图形相关的软件。

  VC++ 中与绘图相关的函数都封装在CDC及其衍生的CClientDC,CpaintDC,CwindowDC中。 

  Delphi中也有一个与CDC相类似的类Tcanvas, 它封装了Delphi 中的绘图函数。我们可以把Delphi和VC中相同或相近的方法做个有趣的比较。

  (一)Canvas和 CDC绘图方法比较:

  我们可以从以下表格中看到Tcanvas和 CDC相似的函数:

表 1--1

Canvas方法	CDC方法	功能
Arc		Arc		画一个椭圆弧
Chord		Chord		画一根玄。
CopyRect			拷贝指定矩形区域中图象到指定矩形
Draw		BitBlt		拷贝位图
Ellipse		Ellipse		画椭圆
FillRect	PaintRgn	使用刷子填充一个又一个矩型
FloodFill	FloodFill	用当前刷子填充区域
FrameRect	FrameRect	画一个矩形框
Lineto		Lineto		画线到
Moveto		Moveto		移	到
Pie		Pie		画扇形
Polygon		Polygon		画多边形
PolyLine	PolyLine	画多根相连的线
Rectangle	Rectangle	画一个实心矩形
RoundRect	RoundRect	画一个圆角的矩形
StretchDraw	StretchBlt	从源图象中
				移动图象到指定矩形
TextWidth	GetCharWidth	返回字符宽
TextOut		TextOut		在指定坐标写字
TextRect	ExtTextOut	在制定矩形中写字
  上表中,我们只列出部分绘图函数,详细了解,请参阅有关Delphi和VC书籍.

  与VC  相类似, Delphi也提供了绘图工具,如 Tpen,Tbrush等,与VC不同的是, Delphi的绘图工具封装在Tcanvas中。Delphi也提供字形及字体大小的类Tfont,下面我们用具体例子来分析它们的用法。

  (二)用Delphi 制作Window95/NT图形软件。

   象使用VC 一样,我们先用Delphi的Wizard 建立一个 SDI 应用程序。Delphi 自动建立SDI 框架, 先运行一次。程序现在还不能干任何事。下一步开始添加代码。

   编辑主菜单。 增加Write,Draw俩个下拉菜单项。 在"Write"下增加"HelloWorld!!","Iamateacher ","Font.."菜单项.在 aw"下增加"Arc","Line", "Polygon","RoundRect","Rectangle","color." ,"LineStyle","WidthLine". 在"LineStyle" 菜单下增加"Solid","Dash","Dot","DashDot", "DashDotDot" 子菜单。

  相应的在SdiForm中增加ColorDialog,FontDialog, 控件。

  在OnPaint事件中增加如下代码:

procedureTSDIAppForm.FormPaint(Sender:TObject);
begin
canvas.FillRect(rect);{清空桌面画布}
withSDIappformdo
posx:=clientwidthdiv2;
posy:=clientheightdiv2;{确定客户区中心点}
casedetectIof
1:
begin
setpenstate;
canvas.Ellipse(posx-50,posy-50,posx 50,posy 50);
//penwidth:=oldwidth;
end;{在客户区中心点画圆}
2:
begin
setpenstate;
canvas.MoveTo(posx-60,posy-60);
canvas.LineTo(posx 60,posy 60);
//penwidth:=oldwidth;
end;{在客户区画直线}

3:
begin
fposx:=trunc(50*cos(pi/6));
fposy:=trunc(50*sin(pi/6));
setpenstate;
Canvas.Polygon([Point(posx-fposy,posy-fposx),
Point(posx fposy,posy-fposx),
Point(posx 50,posy),Point(posx fposy,posy fposx),
point(posx-fposy,posy fposx),point(posx-50,posy)]);
//penwidth:=oldwidth;
end;{在客户区中心点画多边形}
4:
begin
setpenstate;
canvas.RoundRect(posx-100,posy-50,posx 100,posy 50,
20,20);
end;{在客户区中心点画带圆角的矩形}

5:
begin
setpenstate;
sdiappform.Canvas.Brush.Color:=clred;
canvas.Rectangle(posx-100,posy-50,posx 100,posy 50);
sdiappform.Canvas.Brush.Color:=bcolor;
end{在客户区中心点用红色刷子画矩形}
else
begin
canvas.Font:=formfont;
canvas.TextOut(30,posy,str);
end;
end;{写字}
end;
上面程序中出现的变量在事件OnCreate中初始化。
procedureTSDIAppForm.FormCreate(Sender:TObject);
begin
str:=;{要写在画布上的字符串}
formfont:=canvas.font;{字体和大小}
detectI:=0;{确定画布上出现何种图形的参数}
rect:=sdiappform.ClientRect;{客户区矩形}
oldwidth:=sdiappform.Canvas.Pen.Width;{最初画笔宽度}
penwidth:=oldwidth;{画笔宽度}
penstyle:=sdiappform.Canvas.Pen.Style;{画笔类型}
pencolor:=sdiappform.Canvas.Pen.Color;{画笔颜色}
bcolor:=sdiappform.Canvas.Brush.Color;{画刷颜色}
end;
  为了减少代码,定义了一个Public过程,设定画笔。代码如下:
procedureTSDIAppForm.setpenstate;
begin
withsdiappform.Canvas.Pendo
begin
color:=pencolor;
style:=penstyle;
width:=penwidth;
end;
end;
  响应每一个菜单项OnClick事件本程序设计得非常简单,如果有兴趣,读者也可以加上一些代码,完成许多复杂的工作。
procedureTSDIAppForm.LineColor1Click(Sender:TObject);
begin
ifcolordialog1.Executethen
begin
pencolor:=colordialog1.Color;
SdiAppForm.Canvas.Pen.Style:=psInsideFrame;
ifpenwidth$#@60;1then
SdiAppForm.Canvas.Pen.Width:=3;
SdiAppForm.Canvas.Pen.Color:=pencolor;
invalidate;
end;
end;{完成画笔颜色设定}
//{完成画笔笔形设定}
procedureTSDIAppForm.Solid1Click(Sender:TObject);
begin
penStyle:=pssolid;
invalidate;
end;


procedureTSDIAppForm.Dot1Click(Sender:TObject);
begin
PenStyle:=psdot;
invalidate;
end;

procedureTSDIAppForm.Dash1Click(Sender:TObject);
begin
penStyle:=psdash;
invalidate;
end;

procedureTSDIAppForm.DashDot1Click(Sender:TObject);
begin
PenStyle:=psdashdot;
invalidate;
end;

procedureTSDIAppForm.DashDotDot1Click(Sender:TObject);
begin
penStyle:=psdashdotdot;
invalidate;
end;
//////////////////////////////////
procedureTSDIAppForm.RoundRect1Click(Sender:TObject);
begin
detectI:=4;
invalidate;
end;

procedureTSDIAppForm.Rectangle1Click(Sender:TObject);
begin
detectI:=5;
invalidate;
end;

procedureTSDIAppForm.Helloworld1Click(Sender:TObject);
begin
detectI:=0;
str:=helloworld!!;
Invalidate;

end;

procedureTSDIAppForm.Imateacher1Click(Sender:TObject);
begin
detectI:=0;
str:=Iamateacher!!;
Invalidate;
end;

procedureTSDIAppForm.Fonts1Click(Sender:TObject);
begin
iffontdialog1.Executethen
begin
detectI:=0;
formfont:=fontdialog1.font;
invalidate;
end;
end;{设定字体和大小}

			   
			   

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:用DELPHI 设 计 屏 幕 保 护 程 序

下一篇:自动隐藏的声象按钮