Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)

窗体的绘图属性

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 不是整个滚动范围,而只是在任何给定时间可用的区域。  


运行结果:

点击之后:

相关文章
|
21天前
|
存储 Java API
详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
【10月更文挑战第19天】深入剖析Java Map:不仅是高效存储键值对的数据结构,更是展现设计艺术的典范。本文从基本概念、设计艺术和使用技巧三个方面,详细解析HashMap、TreeMap、LinkedHashMap等实现类,帮助您更好地理解和应用Java Map。
37 3
|
1月前
|
存储 编译器 C语言
C++类与对象深度解析(一):从抽象到实践的全面入门指南
C++类与对象深度解析(一):从抽象到实践的全面入门指南
48 8
|
1月前
|
存储 编译器 数据安全/隐私保护
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解2
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
29 3
|
1月前
|
编译器 C++
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解1
【C++篇】C++类与对象深度解析(四):初始化列表、类型转换与static成员详解
44 3
|
1月前
|
Python
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
深入解析 Python 中的对象创建与初始化:__new__ 与 __init__ 方法
17 1
|
1月前
|
程序员 开发者 Python
深度解析Python中的元编程:从装饰器到自定义类创建工具
【10月更文挑战第5天】在现代软件开发中,元编程是一种高级技术,它允许程序员编写能够生成或修改其他程序的代码。这使得开发者可以更灵活地控制和扩展他们的应用逻辑。Python作为一种动态类型语言,提供了丰富的元编程特性,如装饰器、元类以及动态函数和类的创建等。本文将深入探讨这些特性,并通过具体的代码示例来展示如何有效地利用它们。
35 0
|
2月前
|
设计模式 存储 人工智能
深度解析Unity游戏开发:从零构建可扩展与可维护的游戏架构,让你的游戏项目在模块化设计、脚本对象运用及状态模式处理中焕发新生,实现高效迭代与团队协作的完美平衡之路
【9月更文挑战第1天】游戏开发中的架构设计是项目成功的关键。良好的架构能提升开发效率并确保项目的长期可维护性和可扩展性。在使用Unity引擎时,合理的架构尤为重要。本文探讨了如何在Unity中实现可扩展且易维护的游戏架构,包括模块化设计、使用脚本对象管理数据、应用设计模式(如状态模式)及采用MVC/MVVM架构模式。通过这些方法,可以显著提高开发效率和游戏质量。例如,模块化设计将游戏拆分为独立模块。
179 3
|
2月前
|
JavaScript 前端开发 API
Javaweb之javascript的BOM对象的详细解析
BOM为Web开发提供了强大的API,允许开发者与浏览器进行深入的交互。合理使用BOM中的对象和方法,可以极大地增强Web应用的功能性和用户体验。需要注意的是,BOM的某些特征可能会在不同浏览器中表现不一致,因此在开发过程中需要进行仔细的测试和兼容性处理。通过掌握BOM,开发者能够制作出更丰富、更动态、更交互性的JavaWeb应用。
31 1
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0

推荐镜像

更多