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


     窗体的绘图属性

    Canvas属性实际上是一个TCanvas类型对象,它通过窗体对象的GetCanvas方法指向一个TCanvas类型对象。下面来介绍TCanvas类的常用属性和方法。

    Arc:通过该方法可以在界面上画一个弧,语法如下:

    1. procedure Arc(X1,Y1,X2,Y2,X3,Y3,X4,Y4:double);
    2.  {说明:参数X1表示弧边界矩形起始点的x轴坐标,Y1表示弧边界矩形起始点的y轴坐标;
    3. X2、Y2分别表示弧边界矩形终止点的x,y轴坐标;
    4. X3,Y3表示弧的起始点的x,y轴坐标;
    5. X4,Y4分别表示弧的终止点的x,y轴坐标。}

     Brush:由于确定会话填充的颜色和图案。

    CopyRect:将一块画布上的一个矩形区域复制到另一块画布上

    1. CopyRect(const Dest:TRect;Canvas:TCanvas;const Source:TRect);
    2. {参数Dest表示目的矩形区域,Canvas表示原画布,Source表示原矩形区域}

    Draw:画指定的一幅图案

    1. Draw(X,Y:Integer,Graphic:TGraphic);
    2. {说明:X,Y表示绘制位置的x,y坐标,Graphic表示要画到画布上的位图,图标或图源文件}

     DrawFocusRect:画焦点矩形(上一节代码里有示例)

    1. DrawFocusRect(const Rect:TRect);
    2. {参数Rect表示焦点矩形}

     圆弧类图形

    1. unit Unit1;
    2. interface
    3. uses
    4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    5. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ComCtrls;
    6. type
    7. TForm1 = class(TForm)
    8. {PageControl1: TPageControl;
    9. TabSheet1: TTabSheet;
    10. TabSheet2: TTabSheet;
    11. TabSheet3: TTabSheet;
    12. TabSheet4: TTabSheet;}
    13. Button1: TButton;
    14. Button2: TButton;
    15. Button3: TButton;
    16. Button4: TButton;
    17. Button5: TButton;
    18. procedure FormCreate(Sender: TObject);
    19. procedure Button1Click(Sender: TObject);
    20. procedure Button2Click(Sender: TObject);
    21. procedure Button3Click(Sender: TObject);
    22. procedure Button4Click(Sender: TObject);
    23. procedure Button5Click(Sender: TObject);
    24. private
    25. { Private declarations }
    26. public
    27. { Public declarations }
    28. end;
    29. var
    30. Form1: TForm1;
    31. implementation
    32. {$R *.dfm}
    33. var
    34. btn : TButton;
    35. //如果参数在函数中不可能修改, 一定要使用 const
    36. const //这里设置了不可修改的两个值
    37. y1 = 100;
    38. y2 = 500;
    39. {2、根据矩形结构绘制椭圆}
    40. procedure TForm1.Button2Click(Sender: TObject);
    41. var
    42. R:TRect; //定义一个矩形结构
    43. begin
    44. btn:=TButton(Sender);
    45. R:= Rect(btn.Left,y1,btn.Left+btn.Width,y2);
    46. Canvas.Ellipse(R);
    47. end;
    48. {3、绘制扇形}
    49. procedure TForm1.Button3Click(Sender: TObject);
    50. begin
    51. btn := TButton(Sender);
    52. Canvas.Pie(
    53. btn.Left, y1, {矩形区域左上角}
    54. btn.Left + btn.Width, y2, {矩形区域右下角}
    55. btn.Left + btn.Width, y1 + (y2-y1) div 2, {扇形起点}
    56. btn.Left + btn.Width div 2, y1 {扇形终点}
    57. );
    58. end;
    59. {4、绘制弦,参数和扇形一样}
    60. procedure TForm1.Button4Click(Sender: TObject);
    61. begin
    62. btn := TButton(Sender);
    63. Canvas.Chord(
    64. btn.Left, y1,
    65. btn.Left + btn.Width, y2,
    66. btn.Left + btn.Width, y1 + (y2-y1) div 2,
    67. btn.Left + btn.Width div 2, y1
    68. );
    69. end;
    70. {5、绘制弧线}
    71. procedure TForm1.Button5Click(Sender: TObject);
    72. begin
    73. btn := TButton(Sender);
    74. Canvas.Arc(
    75. btn.Left, y1,
    76. btn.Left + btn.Width, y2,
    77. btn.Left + btn.Width, y1 + (y2-y1) div 2,
    78. btn.Left + btn.Width div 2, y1
    79. );
    80. end;
    81. {在form打开时就自动创建画笔画刷}
    82. procedure TForm1.FormCreate(Sender: TObject);
    83. begin
    84. Canvas.Pen.Width := 4;
    85. Canvas.Pen.Color := clRed;
    86. Canvas.Brush.Color := clWhite; //设置画刷颜色
    87. end;
    88. {1、绘制椭圆; 椭圆的参数和矩形是一样的}
    89. procedure TForm1.Button1Click(Sender: TObject);
    90. begin
    91. btn:= TButton(sender);
    92. Canvas.Ellipse(btn.left,y1,btn.left+btn.width,y2);
    93. end;
    94. end.

    运行结果如下: 


    获取Canvas对象

    我们需要在窗体上添加 Panel1、PaintBox1 和 Button1(我这里是Button6), 代码如下: 

    1. procedure TForm1.Button6Click(Sender: TObject);
    2. var
    3. cvs:TCanvas;
    4. begin
    5. {PaintBox1 就像窗体一样,也有Canvas属性}
    6. PaintBox1.Canvas.Brush.Color:=clRed;
    7. PaintBox1.Canvas.FillRect(PaintBox1.ClientRect);
    8. {像Panel1这样没有Canvas属性的控件,也可以绕道获取}
    9. cvs := TCanvas.Create; //先创建一个Canvas对象
    10. cvs.Handle := GetDC(Panel1.Handle);//传递Panel1的句柄
    11. { WindowsAPI 函数 GetDC,传递窗口控件的 Handle 属性。
    12. 它返回 WindowHandle 参数中的窗口句柄,并将 HDC 作为返回值。
    13. 如果调用不成功,将引发 EOutOfResources 异常。}
    14. cvs.Brush.Color := clBlue; //设置画刷
    15. cvs.FillRect(Panel1.ClientRect); //填充Panel1的矩形区域
    16. end;
    ClientRect

    指定控件的工作区大小(以像素为单位)。

    读取 ClientRect 以查找控件的工作区大小。ClientRect 返回一个矩形,其 Top 和 Left 字段设置为零,其 Bottom 和 Right 字段分别设置为控件的 Height 和 Width。ClientRect 等效于 Rect (0,0,ClientWidth,ClientHeight)。

    如果一个点位于控件的客户端矩形的左侧或上侧,而不是位于右侧或底侧,则该点被认为位于该控件的客户端矩形内。也就是说,要在客户端矩形内,X 坐标必须大于或等于 ClientRect。左边和小于 ClientRect。对,并且 Y 坐标必须大于或等于 ClientRect。顶部和低于 ClientRect。波顿。

    注意: ClientRect 是控件的物理客户区的大小,而不是其逻辑客户区的大小。如果控件支持滚动,则 ClientRect 不是整个滚动范围,而只是在任何给定时间可用的区域。 

    运行结果: 

    点击之后:

  • 相关阅读:
    Cross-species regulatory sequence activity prediction
    大家都能看得懂的源码之ahooks useInfiniteScroll
    CH59X/CH58X/CH57X PWM使用
    Biotin-PEG-MAL,生物素PEG马来酰亚胺
    C++多态(多态实现原理 ,多态继承总结)
    论文笔记 A Comprehensive Survey on Graph Neural Networks(GNN综述)
    LC-3 汇编语言 中断实验
    【短文】在Linux中怎么查看文件信息
    STM32CubeMX之DMA辅助串口数据接收
    SpringBoot+SpringSecurity+JWT
  • 原文地址:https://blog.csdn.net/m0_62853489/article/details/127720107