收藏 分销(赏)

Delphi_的绘图功能.doc

上传人:二*** 文档编号:4746823 上传时间:2024-10-11 格式:DOC 页数:45 大小:645KB 下载积分:5 金币
下载 相关 举报
Delphi_的绘图功能.doc_第1页
第1页 / 共45页
本文档共45页,全文阅读请下载到手机保存,查看更方便
资源描述
Graphics 单元中的类 //Graphics 单元中的类 TGraphicsObject TFont TPen TBrush TFontRecall TPenRecall TBrushRecall TCanvas TGraphic TPicture TMetafileCanvas TMetafileImage TMetafile TBitmapImage TBitmap TIconImage TIcon TResourceManager TBrushResourceManager TFileFormatsList Delphi 的绘图功能[1] - TCanvas 的类成员 //过程: Arc BrushCopy Chord CopyRect Draw DrawFocusRect Ellipse Ellipse FillRect FloodFill FrameRect LineTo Lock MoveTo Pie Polygon Polyline PolyBezier PolyBezierTo Rectangle Rectangle Refresh RoundRect StretchDraw TextOut TextRect TextRect Unlock //函数: HandleAllocated TextExtent TextHeight TextWidth TryLock //属性: ClipRect Handle LockCount CanvasOrientation PenPos Pixels TextFlags Brush CopyMode Font Pen //事件 OnChange OnChanging Delphi 的绘图功能[2] - 入门 绘图需要有纸、画笔、画刷; Delphi 有 Canvas、Pen、Brush. Canvas 就是画布, 譬如窗体的 Canvas 属性, 就是窗体的画布; Pen 是画笔, 可以设置笔色、笔宽等等; Brush 是画刷, 可以设置颜色等等. //举例: {绘制直线} procedure TForm1.Button1Click(Sender: TObject); begin Canvas.Pen.Color := clRed; {设置画笔颜色} Canvas.Pen.Width := 2; {设置画笔宽度} Canvas.MoveTo(10,10); {直线起点} Canvas.LineTo(100,100); {直线终点} {这里的 Canvas 是简写, 也可以写做: Self.Canvas 或 Form1.Canvas } end; {矩形填充} procedure TForm1.Button2Click(Sender: TObject); begin Canvas.Brush.Color := clYellow; {设置画刷颜色, 也就是填充色} Canvas.FillRect(ClientRect); {填充窗体客户区} end; //效果图: Delphi 的绘图功能[3] - 矩形类图形 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var btn: TButton; const y1 = 10; y2 = 80; {先设置画笔画刷} procedure TForm1.FormCreate(Sender: TObject); begin Canvas.Pen.Width := 4; Canvas.Pen.Color := clRed; Canvas.Brush.Color := clWhite; end; {给出左上角和右下角的坐标就可以绘制矩形} procedure TForm1.Button1Click(Sender: TObject); begin btn := TButton(Sender); Canvas.Rectangle(btn.Left, y1, btn.Left+btn.Width, y2); end; {给出一个矩形结构做参数也可以绘制矩形} procedure TForm1.Button2Click(Sender: TObject); var R: TRect; {定义一个矩形结构} begin btn := TButton(Sender); R := Rect(btn.Left, y1, btn.Left+btn.Width, y2); Canvas.Rectangle(R); end; {绘制圆角矩形; 最后两个参数是设置圆角的} procedure TForm1.Button3Click(Sender: TObject); begin btn := TButton(Sender); Canvas.RoundRect(btn.Left, y1, btn.Left+btn.Width, y2, 20,20); end; {绘制焦点矩形; 它不受画笔的影响; 它的颜色是和画刷的颜色进行某种运算得来的} procedure TForm1.Button4Click(Sender: TObject); var R: TRect; begin btn := TButton(Sender); R := Rect(btn.Left, y1, btn.Left+btn.Width, y2); Canvas.DrawFocusRect(R); end; {矩形描边, 用的不是画笔是画刷} procedure TForm1.Button5Click(Sender: TObject); var R: TRect; begin btn := TButton(Sender); R := Rect(btn.Left, y1, btn.Left+btn.Width, y2); Canvas.FrameRect(R); end; end. //效果图: Delphi 的绘图功能[4] - 圆弧类图形 unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; Button5: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} var btn: TButton; const y1 = 10; y2 = 80; {先设置画笔画刷} procedure TForm1.FormCreate(Sender: TObject); begin Canvas.Pen.Width := 2; Canvas.Pen.Color := clRed; Canvas.Brush.Color := clWhite; end; {绘制椭圆; 椭圆的参数和矩形是一样的} procedure TForm1.Button1Click(Sender: TObject); begin btn := TButton(Sender); Canvas.Ellipse(btn.Left, y1, btn.Left+btn.Width, y2); end; {根据矩形结构绘制椭圆} procedure TForm1.Button2Click(Sender: TObject); var R: TRect; {定义一个矩形结构} begin btn := TButton(Sender); R := Rect(btn.Left, y1, btn.Left+btn.Width, y2); Canvas.Ellipse(R); end; {绘制扇形} procedure TForm1.Button3Click(Sender: TObject); begin btn := TButton(Sender); Canvas.Pie( btn.Left, y1, {矩形区域左上角} btn.Left + btn.Width, y2, {矩形区域右下角} btn.Left + btn.Width, y1 + (y2-y1) div 2, {扇形起点} btn.Left + btn.Width div 2, y1 {扇形终点} ); end; {绘制弦, 参数同上} procedure TForm1.Button4Click(Sender: TObject); begin btn := TButton(Sender); Canvas.Chord( btn.Left, y1, btn.Left + btn.Width, y2, btn.Left + btn.Width, y1 + (y2-y1) div 2, btn.Left + btn.Width div 2, y1 ); end; {绘制弧线, 参数同上} procedure TForm1.Button5Click(Sender: TObject); begin btn := TButton(Sender); Canvas.Arc( btn.Left, y1, btn.Left + btn.Width, y2, btn.Left + btn.Width, y1 + (y2-y1) div 2, btn.Left + btn.Width div 2, y1 ); end; end. //效果图: Delphi 的绘图功能[5] - 获取 Canvas 对象 在窗体上添加 Panel1、PaintBox1 和 Button1, 代码如下: procedure TForm1.Button1Click(Sender: TObject); var cvs: TCanvas; begin {PaintBox1 就像窗体一样, 也有 Canvas 属性} PaintBox1.Canvas.Brush.Color := clRed; PaintBox1.Canvas.FillRect(PaintBox1.ClientRect); {像 Panel1 这样没有 Canvas 属性的控件, 也可以绕道获取} cvs := TCanvas.Create; cvs.Handle := GetDC(Panel1.Handle); cvs.Brush.Color := clBlue; cvs.FillRect(Panel1.ClientRect); cvs.Free; end; //执行前后对比图: Delphi 的绘图功能[6] - Polygon、Polyline unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Canvas.Pen.Width := 2; Canvas.Pen.Color := clRed; Canvas.Brush.Color := clYellow; end; {绘制多边形; 它的参数是一个点数组, 这里定义了一个常数数组} procedure TForm1.Button1Click(Sender: TObject); const pts: array[0..3] of TPoint = ( (x:10; y:40), (x:46; y:120), (x:82; y:40), (x:46; y:10) ); begin Canvas.Polygon(pts); end; {绘制连续的一组直线; 它的参数也是一个点数组, 我只是把上面的平移了一点} procedure TForm1.Button2Click(Sender: TObject); const pts: array[0..3] of TPoint = ( (x:10+82; y:40), (x:46+82; y:120), (x:82+82; y:40), (x:46+82; y:10) ); begin Canvas.Polyline(pts); end; end. //效果图: Delphi 的绘图功能[7] - PolyBezier、PolyBezierTo unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} {PolyBezier 至少需要四个点做参数; 不改变画笔的当前位置} procedure TForm1.Button1Click(Sender: TObject); var pts: array[0..3] of TPoint; begin Canvas.Pen.Width := 2; Canvas.Pen.Color := clRed; pts[0].X := 10; pts[0].Y := 10; {起点} pts[1].X := 60; pts[1].Y := 10; {控制点1} pts[2].X := 10; pts[2].Y := 100; {控制点2} pts[3].X := 60; pts[3].Y := 100; {终点} Canvas.PolyBezier(pts); Canvas.Pen.Width := 1; Canvas.Pen.Color := clWhite; Canvas.LineTo(ClientWidth, ClientHeight); end; {PolyBezierTo 最少只需要需要三个点, 它把当前位置当作第一点; 会改变画笔的当前位置} procedure TForm1.Button2Click(Sender: TObject); var pts: array[1..3] of TPoint; {从 1 开始的, 就 3 个元素} begin Canvas.Pen.Width := 2; Canvas.Pen.Color := clRed; Canvas.MoveTo(10 + 82, 10); {起点} //pts[0].X := 10; pts[0].Y := 10; pts[1].X := 60 + 82; pts[1].Y := 10; {控制点1} pts[2].X := 10 + 82; pts[2].Y := 100; {控制点2} pts[3].X := 60 + 82; pts[3].Y := 100; {终点} Canvas.PolyBezierTo(pts); Canvas.Pen.Width := 1; Canvas.Pen.Color := clBlue; Canvas.LineTo(ClientWidth, ClientHeight); end; end. //效果图: //绘制多条贝塞尔线时, 每条线的终点也是下条线的起点. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} {PolyBezier 绘制多条线时, 需要 3*x + 1 个点} procedure TForm1.Button1Click(Sender: TObject); var pts: array[0..6] of TPoint; begin Canvas.Pen.Width := 2; Canvas.Pen.Color := clRed; pts[0].X := 10; pts[0].Y := 10; pts[1].X := 60; pts[1].Y := 10; pts[2].X := 10; pts[2].Y := 100; pts[3].X := 40; pts[3].Y := 100; pts[4].X := 100; pts[4].Y := 10; pts[5].X := 55; pts[5].Y := 99; pts[6].X := 70; pts[6].Y := 10; Canvas.PolyBezier(pts); end; {PolyBezierTo 绘制多条线时, 需要 3*x 个点} procedure TForm1.Button2Click(Sender: TObject); var pts: array[1..6] of TPoint; begin Canvas.Pen.Width := 2; Canvas.Pen.Color := clRed; Canvas.MoveTo(10 + 82, 10); //pts[0].X := 10; pts[0].Y := 10; pts[1].X := 60 + 82; pts[1].Y := 10; pts[2].X := 10 + 82; pts[2].Y := 100; pts[3].X := 40 + 82; pts[3].Y := 100; pts[4].X := 100 + 82; pts[4].Y := 10; pts[5].X := 55 + 82; pts[5].Y := 99; pts[6].X := 70 + 82; pts[6].Y := 10; Canvas.PolyBezierTo(pts); end; end. //效果图: Delphi 的绘图功能[8] - TextOut、TextWidth、TextHeight unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); const arr: array[0..3] of WideString = ( '白日依山尽', '黄河入海流', '欲穷千里目', '更上一层楼' ); a = 20; {横向间隔} b = 20; {纵向间隔} var s: string; x,y: Integer; i,j: Integer; begin x := 20; y := 20; for i := 0 to Length(arr)-1 do begin for j := 1 to Length(arr[i]) do {j := 0 to Length(arr[i])-1 ? WideString!} begin s := arr[i][j]; Canvas.TextOut(x, y, s); x := x + Canvas.TextWidth(s) + a; end; x := 20; y := y + Canvas.TextHeight(s) + b; end; end; end. //效果图: Delphi 的绘图功能[9] - TextRect //第一种重载的声明: TextRect( Rect: TRect; {矩形} X, Y: Integer; {相对于窗体的位置} const Text: string {文本} ); {如果要输出的文本超出指定的矩形将不被显示} //第一种重载的举例: procedure TForm1.Button1Click(Sender: TObject); const R: TRect = (Left:0; Top:0; Right:60; Bottom:60); s = '万一的 Delphi 博客'; begin Canvas.Brush.Color := clWhite; Canvas.FillRect(R); Canvas.TextRect(R, 10, 10, s); end; //效果图: //第二种重载的声明: TextRect( var Rect: TRect; {矩形范围} var Text: string; {文本} TextFormat: TTextFormat = [] {选项; 集合类型, 默认值是个空的集合} ); {参数三是 TTextFormat 类型的集合, 它定义如下:} TTextFormat = set of TTextFormats; {TTextFormats 是个枚举, 定义如下} TTextFormats = (tfBottom, tfCalcRect, tfCenter, tfEditControl, tfEndEllipsis, tfPathEllipsis, tfExpandTabs, tfExternalLeading, tfLeft, tfModifyString, tfNoClip, tfNoPrefix, tfRight, tfRtlReading, tfSingleLine, tfTop, tfVerticalCenter, tfWordBreak); {所以参数三可以是下列值之一或它们的组合} tfBottom tfCalcRect tfCenter tfEditControl tfEndEllipsis tfPathEllipsis tfExpandTabs tfExternalLeading tfLeft tfModifyString tfNoClip tfNoPrefix tfRight tfRtlReading tfSingleLine tfTop tfVerticalCenter tfWordBreak //这个函数是 API 函数 DrawTextEx 的简化, 可以参见: DrawTextEx //第二种重载的举例1: {默认是顶对齐、左对齐; 前两个参数都是传址的, 不能用常量} procedure TForm1.FormPaint(Sender: TObject); var R: TRect; S: string; begin R := ClientRect; InflateRect(R,-10,-10); {把矩形缩小一圈} S := 'Delphi'; Canvas.Brush.Color := clWhite; Canvas.FillRect(R); Canvas.TextRect(R, S); end; //效果图: //第二种重载的举例2: {单行文本、水平居中、垂直居中} procedure TForm1.FormPaint(Sender: TObject); var R: TRect; S: string; begin R := ClientRect; InflateRect(R,-10,-10); {把矩形缩小一圈} S := 'Delphi'; Canvas.Brush.Color := clWhite; Canvas.FillRect(R); Canvas.TextRect(R, S , [tfSingleLine, tfCenter, tfVerticalCenter]); end; //效果图: Delphi 的绘图功能[10] - TFONT 类 //先来个例子: procedure TForm1.FormPaint(Sender: TObject); const S = '万一的 Delphi 博客'; var font: TFont; begin font := TFont.Create; font.Name := '微软雅黑'; font.Style := [fsBold, fsItalic]; font.Color := clRed; font.Height := 72; Canvas.Font := font; Canvas.TextOut(10, 10, S); font.Free; end; //效果图: //因为 Canvas 的 Font 属性就是 TFONT 类的一个实例, 所以上面的程序可以简化为: procedure TForm1.FormPaint(Sender: TObject); const S = '万一的 Delphi 博客'; begin Canvas.Font.Name := '微软雅黑'; Canvas.Font.Style := [fsBold, fsItalic]; Canvas.Font.Color := clRed; Canvas.Font.Height := 72; Canvas.TextOut(10, 10, S); end; //TFont 类的常用属性: {Name: 字体名称} {Color: 颜色} {Size、Height: 字号与字体高度, 都可以设定字体大小} {Style: 字体样式; 是个集合值, 是下面可选值或它们的组合:} fsBold fsItalic fsUnderline fsStrikeOut {Pitch: 是字间距相关的, 有三个枚举值可选(不过我没测试出效果):} fpDefault fpVariable fpFixed {Charset: 字符集, 是个整数, 可能的值有:} ANSI_CHARSET = 0; DEFAULT_CHARSET = 1; SYMBOL_CHARSET = 2; SHIFTJIS_CHARSET = 128; HANGEUL_CHARSET = 129; GB2312_CHARSET = 134; CHINESEBIG5_CHARSET = 136; OEM_CHARSET = 255; JOHAB_CHARSET = 130; HEBREW_CHARSET = 177; ARABIC_CHARSET = 178; GREEK_CHARSET = 161; TURKISH_CHARSET = 162; VIETNAMESE_CHARSET = 163; THAI_CHARSET = 222; EASTEUROPE_CHARSET = 238; RUSSIAN_CHARSET = 204; {Orientation: 旋转角度, 单位是 1/10 度, 举个例子:} //代码: const S = '万一的 Delphi 博客'; begin Canvas.Font.Style := [fsBold]; Canvas.Font.Color := clRed; Canvas.Font.Height := 32; Canvas.Font.Orientation := 450; Canvas.TextOut(0, ClientHeight-20, S); end; //效果图: Delphi 的绘图功能[11] - TPen 类(上) //TPen 的主要属性有四: Color、Width、Style、Mode {Color: 颜色} {Width: 宽度; 默认是 1; 如果赋予 <= 0 的值, 会使用默认值} {Style: 样式; Delphi 定义了笔样式枚举 TPenStyle, 包含以下样式:} psSolid = 0; {实线} psDash = 1; {段线; 要求笔宽<=1} psDot = 2; {点线; 要求笔宽<=1} psDashDot = 3; {线、点; 要求笔宽<=1} psDashDotDot = 4; {线、点、点; 要求笔宽<=1} psClear = 5; {不可见} psInsideFrame = 6; {实线; 但笔宽是向里扩展} psUserStyle = 7; {自定义, Delphi.Net 支持} psAlternate = 8; {交替, Delphi.Net 支持} //下面的例子依次展示了各种样式: var i,x,y,n: Integer; begin x := 10; y := 15;
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服