• Delphi GDI+ 绘图 (1)


    绘图需要有纸、画笔、画刷; 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;
    
     

    最好用 TPaintBox 并在其 OnPaint 事件中绘图。而不是在Image控件中Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);



    TImage、TPaintBox、TPicture、TBitmap、TCanvas、TGraphic 的关系与区别

    TGraphic 是 TBitmap 的父类, 很多绘图函数的参数是 TGraphic, 但我们经常给函数的是 TBitmap;

    TBitmap 的很多功能都是继承自 TGraphic, 譬如:
    Width、Height、LoadFromFile、SaveToFile、LoadFromStream、SaveToStream;
    还有 Palette(调色板)、Transparent(是否透明) 等等.

    TGraphic 实用举例:


    var
      g: TGraphic;
    begin
      g := TBitmap.Create;
      g.LoadFromFile('c:\temp\test.bmp');
      Self.Canvas.StretchDraw(ClientRect, g);
      g.Free;
    end;
    


    TCanvas 是一个绘图表面, 像画圆、画方、画笔、画刷等等都是它的功能;

    控件的 Canvas 属性就是一个 TCanvas, 譬如:


    var
      cvs: TCanvas;
    begin
      cvs := Self.Canvas;
      cvs.Brush.Color := clYellow;
      cvs.Font.Color := clRed;
      cvs.Font.Name := '宋体';
      cvs.Font.Style := [fsBold];
      cvs.Font.Size := 24;
      cvs.TextOut(10, 10, '万一的 Delphi 博客');
    end;
    


    有些控件没有直接给 Canvas 属性, 我们也可以通过 TCanvas 获取它的绘图表面;
    一切看得见的控件都应该有绘图表面, 不然系统是怎么画的?

    譬如 TPanel 和 TButton 就没有 Canvas 属性, 没有是因为不常用, 如果需要可以这样:


    var
      cvs: TCanvas;
    begin
      cvs := TCanvas.Create;
      cvs.Handle := GetDC(Panel1.Handle);
      cvs.Pen.Width := 2;
      cvs.Pen.Color := clRed;
      cvs.Brush.Color := clYellow;
      cvs.Rectangle(5, 5, 50, 30);
      cvs.Free;
    end;
    


    再说 TBitmap, 它从 TGraphic 继承, 同时又把 TCanvas 纳为自己的属性;
    所以它有了处理图片和绘图的双重功能!

    给 TBitmap 也举个例子吧:


    var
      bit: TBitmap;
    begin
      bit := TBitmap.Create;
      bit.LoadFromFile('c:\temp\test.bmp');
      bit.Canvas.Brush.Style := bsClear;
      bit.Canvas.Pen.Color := clRed;
      bit.Canvas.Pen.Width := 2;
      bit.Canvas.Ellipse(2, 2, 88, 66);
      Self.Canvas.Draw(0, 0, bit);
      bit.Free;
    end;
    


    TPicture 是为了处理更多种格式的图片(譬如: ico、wmf 等)而存在的;
    但它把 TGraphic、TCanvas、TBitmap 的功能通通借用过来, 所以功能更强大.

    TPicture 和 TGraphic 重复的功能(譬如: LoadFromFile)都是内部调用的 TGraphic;
    但如果要给它绘图, 需要调用: TPicture.Bitmap.Canvas.

    下面的例子是用 TPicture 画了个十字图标(显示并保存起来):


    var
      pic: TPicture;
    begin
      pic := TPicture.Create;
      pic.Bitmap.SetSize(32, 32);
      pic.Bitmap.Canvas.Pen.Color := clRed;
      pic.Bitmap.Canvas.Pen.Width := 8;
      pic.Bitmap.Canvas.MoveTo(0, 16);
      pic.Bitmap.Canvas.LineTo(32, 16);
      pic.Bitmap.Canvas.MoveTo(16, 0);
      pic.Bitmap.Canvas.LineTo(16, 32);
    
      Self.Canvas.Draw(4, 4, pic.Graphic);
      pic.SaveToFile('c:\temp\test.ico');
      pic.Free;
    end;
    


    TImage 则主要是为了显示图片, 它主要包含的是 TPicture, 有了 TPicture 就有了上面的一切;
    但因它是从 TControl -> TGraphicControl 继承下来的, 所以它具备了控件的基本能力(事件、消息等等).

    TPaintBox 主要用于绘图, 没有处理图片的能力, 所以只包含了 TCanvas;
    它也是从 TControl -> TGraphicControl 继承, 是能够交互的控件了.

    很显然, TImage 比 TPaintBox 的能力强大; 但仅就绘图来讲, 还是 TPaintBox 轻便些.

  • 相关阅读:
    HDU 3389 Game (阶梯博弈)
    国内操作系统OS分析(上)
    激光雷达应用技术分析
    构建深度学习框架运行平台
    GitHub上YOLOv5开源代码的训练数据定义
    GitHub上开源的YOLOv5
    深度学习调用TensorFlow、PyTorch等框架
    CUDA C 纹理提取Texture Fetching
    CPU,GPU,GPGPU
    毫米波RADAR与LIDAR探秘
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3000834.html
Copyright © 2020-2023  润新知