窗体的绘图属性
Canvas属性实际上是一个TCanvas类型对象,它通过窗体对象的GetCanvas方法指向一个TCanvas类型对象。下面来介绍TCanvas类的常用属性和方法。
Arc:通过该方法可以在界面上画一个弧,语法如下:
procedure Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:double); {说明:参数X1表示弧边界矩形起始点的x轴坐标,Y1表示弧边界矩形起始点的y轴坐标; X2、Y2分别表示弧边界矩形终止点的x,y轴坐标; X3,Y3表示弧的起始点的x,y轴坐标; X4,Y4分别表示弧的终止点的x,y轴坐标。}
Brush:由于确定会话填充的颜色和图案。
CopyRect:将一块画布上的一个矩形区域复制到另一块画布上
CopyRect(const Dest:TRect;Canvas:TCanvas;const Source:TRect); {参数Dest表示目的矩形区域,Canvas表示原画布,Source表示原矩形区域}
Draw:画指定的一幅图案
Draw(X,Y:Integer,Graphic:TGraphic); {说明:X,Y表示绘制位置的x,y坐标,Graphic表示要画到画布上的位图,图标或图源文件}
DrawFocusRect:画焦点矩形(上一节代码里有示例)
DrawFocusRect(const Rect:TRect); {参数Rect表示焦点矩形}
圆弧类图形
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls; type TForm1 = class(TForm) {PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; TabSheet3: TTabSheet; TabSheet4: TTabSheet;} 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); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var btn : TButton; //如果参数在函数中不可能修改, 一定要使用 const const //这里设置了不可修改的两个值 y1 = 100; y2 = 500; {2、根据矩形结构绘制椭圆} 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; {3、绘制扇形} 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; {4、绘制弦,参数和扇形一样} 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; {5、绘制弧线} 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; {在form打开时就自动创建画笔画刷} procedure TForm1.FormCreate(Sender: TObject); begin Canvas.Pen.Width := 4; Canvas.Pen.Color := clRed; Canvas.Brush.Color := clWhite; //设置画刷颜色 end; {1、绘制椭圆; 椭圆的参数和矩形是一样的} procedure TForm1.Button1Click(Sender: TObject); begin btn:= TButton(sender); Canvas.Ellipse(btn.left,y1,btn.left+btn.width,y2); end; end.
运行结果如下:
获取Canvas对象
我们需要在窗体上添加 Panel1、PaintBox1 和 Button1(我这里是Button6), 代码如下:
procedure TForm1.Button6Click(Sender: TObject); var cvs:TCanvas; begin {PaintBox1 就像窗体一样,也有Canvas属性} PaintBox1.Canvas.Brush.Color:=clRed; PaintBox1.Canvas.FillRect(PaintBox1.ClientRect); {像Panel1这样没有Canvas属性的控件,也可以绕道获取} cvs := TCanvas.Create; //先创建一个Canvas对象 cvs.Handle := GetDC(Panel1.Handle);//传递Panel1的句柄 { WindowsAPI 函数 GetDC,传递窗口控件的 Handle 属性。 它返回 WindowHandle 参数中的窗口句柄,并将 HDC 作为返回值。 如果调用不成功,将引发 EOutOfResources 异常。} cvs.Brush.Color := clBlue; //设置画刷 cvs.FillRect(Panel1.ClientRect); //填充Panel1的矩形区域 end;
ClientRect
指定控件的工作区大小(以像素为单位)。
读取 ClientRect 以查找控件的工作区大小。ClientRect 返回一个矩形,其 Top 和 Left 字段设置为零,其 Bottom 和 Right 字段分别设置为控件的 Height 和 Width。ClientRect 等效于 Rect (0,0,ClientWidth,ClientHeight)。
如果一个点位于控件的客户端矩形的左侧或上侧,而不是位于右侧或底侧,则该点被认为位于该控件的客户端矩形内。也就是说,要在客户端矩形内,X 坐标必须大于或等于 ClientRect。左边和小于 ClientRect。对,并且 Y 坐标必须大于或等于 ClientRect。顶部和低于 ClientRect。波顿。
注意: ClientRect 是控件的物理客户区的大小,而不是其逻辑客户区的大小。如果控件支持滚动,则 ClientRect 不是整个滚动范围,而只是在任何给定时间可用的区域。
运行结果:
点击之后: