zoukankan      html  css  js  c++  java
  • GdiPlus[33]: 基本绘图与填充命令


    DrawLine();
    DrawLines();
    DrawArc();
    DrawBezier();
    DrawBeziers();
    DrawRectangle();
    DrawRectangles();
    DrawEllipse();
    DrawPie();
    DrawPolygon();
    DrawCurve();
    DrawClosedCurve();
    
    FillRectangle();
    FillRectangles();
    FillPolygon();
    FillEllipse();
    FillPie();
    FillClosedCurve();
    

    DrawLines、DrawPolygon、FillPolygon 测试图:



    DrawLines、DrawPolygon、FillPolygon 测试代码:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    const
      Pts: array[0..3] of TGPPointF = ((X:20; Y:80), (X:60; Y:20), (X:100; Y:80), (X:60; Y:140));
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Brush: IGPSolidBrush;
      Font: IGPFont;
      i: Integer;
    begin
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FFFF0000, 2);
      Brush := TGPSolidBrush.Create($FF000000);
      Font := TGPFont.Create(Canvas.Handle);
    
      Graphics.DrawLines(Pen, Pts);
      for i := 0 to Length(Pts) - 1 do Graphics.DrawString(IntToStr(i), Font, Pts[i], Brush);
    
      Graphics.TranslateTransform(110, 0);
      Graphics.DrawPolygon(Pen, Pts);
    
      Brush.Color := $FFFFFF00;
      Graphics.TranslateTransform(110, 0);
      Graphics.FillPolygon(Brush, Pts);
    
      Graphics.TranslateTransform(110, 0);
      Graphics.FillPolygon(Brush, Pts);
      Graphics.DrawPolygon(Pen, Pts);
    end;
    

    DrawRectangles、FillRectangles 测试图:



    DrawRectangles、FillRectangles 测试代码:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Brush: IGPSolidBrush;
      Rects: array[0..2] of TGPRect;
    begin
      Rects[0].Initialize(40, 20, 20, 20);
      Rects[1].Initialize(30, 40, 40, 40);
      Rects[2].Initialize(10, 80, 80, 80);
    
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FFFF0000, 2);
      Brush := TGPSolidBrush.Create($FFC0C0C0);
    
      Graphics.DrawRectangles(Pen, Rects);
    
      Graphics.TranslateTransform(110, 0);
      Graphics.FillRectangles(Brush, Rects);
    
      Graphics.TranslateTransform(110, 0);
      Graphics.FillRectangles(Brush, Rects);
      Graphics.DrawRectangles(Pen, Rects);
    end;
    

    DrawArc、DrawPie、FillPie 测试图:



    DrawArc、DrawPie、FillPie 测试代码:

    uses GdiPlus;
    
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Brush: IGPSolidBrush;
      Rect: TGPRect;
    begin
      Rect.Initialize(15, 15, 160, 80);
    
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FFFF0000, 2);
      Brush := TGPSolidBrush.Create($FFB0C4DE);
    
      Graphics.FillEllipse(Brush, Rect);
      Graphics.DrawArc(Pen, Rect, 0, 45);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      Graphics.FillEllipse(Brush, Rect);
      Graphics.DrawPie(Pen, Rect, 0, 45);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      Graphics.FillEllipse(Brush, Rect);
      Brush.Color := $FFFFD700;
      Graphics.FillPie(Brush, Rect, 0, 45);
      Graphics.TranslateTransform(0, Rect.Y + Rect.Height);
    
      Brush.Color := $FFB0C4DE;
      Graphics.FillEllipse(Brush, Rect);
      Brush.Color := $FFFFD700;
      Graphics.FillPie(Brush, Rect, 0, 45);
      Graphics.DrawPie(Pen, Rect, 0, 45);
    end;
    

    DrawCurve、DrawClosedCurve、FillClosedCurve 测试图:



    DrawCurve、DrawClosedCurve、FillClosedCurve 测试代码:

    uses GdiPlus;
    
    const
      Pts: array [0..5] of TGPPoint = (
        (X: 10;  Y:  40),
        (X: 100; Y:  60),
        (X: 150; Y:  20),
        (X: 130; Y: 100),
        (X: 70;  Y:  80),
        (X: 30;  Y: 140));
    
    procedure TForm1.FormPaint(Sender: TObject);
    const
      m = 180;
      n = 160;
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      BrushBak, Brush: IGPBrush;
    begin
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FFFF0000, 2);
      BrushBak := TGPSolidBrush.Create($FFD8BFD8);
      Brush := TGPSolidBrush.Create($FFFFD700);
    
      with Graphics do
      begin
        FillPolygon(BrushBak, Pts);
        DrawCurve(Pen, Pts);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        DrawCurve(Pen, Pts, 1.5);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        DrawCurve(Pen, Pts, 0.5);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        DrawCurve(Pen, Pts, 0);
    
        //
        TranslateTransform(-Transform.OffsetX, 150);
    
        FillPolygon(BrushBak, Pts);
        DrawClosedCurve(Pen, Pts);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        DrawClosedCurve(Pen, Pts, 1.5);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        DrawClosedCurve(Pen, Pts, 0.5);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        DrawClosedCurve(Pen, Pts, 0);
    
        //
        TranslateTransform(-Transform.OffsetX, n);
    
        FillPolygon(BrushBak, Pts);
        FillClosedCurve(Brush, Pts);
        DrawClosedCurve(Pen, Pts);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        FillClosedCurve(Brush, Pts, FillModeAlternate, 1.5);
        DrawClosedCurve(Pen, Pts, 1.5);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        FillClosedCurve(Brush, Pts, FillModeAlternate, 0.5);
        DrawClosedCurve(Pen, Pts, 0.5);
        TranslateTransform(m, 0);
    
        FillPolygon(BrushBak, Pts);
        FillClosedCurve(Brush, Pts, FillModeAlternate, 0);
        DrawClosedCurve(Pen, Pts, 0);
      end;
    end;
    

    DrawBezier 测试图:



    DrawBezier 测试代码:

    uses GdiPlus;
    
    //一条 Bezier 线需要四个点: 两个端点、两个控制点
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      P1,C1,C2,P2: TGPPoint;
    begin
      P1.Initialize(30, 100);
      C1.Initialize(120, 10);
      C2.Initialize(170, 150);
      P2.Initialize(220, 80);
    
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FF0000FF, 2);
    
      Graphics.DrawBezier(Pen, P1, C1, C2, P2);
    
      Pen.Width := 1;
      Pen.Color := $FFFF0000;
      Graphics.DrawRectangle(Pen, P1.X-3, P1.Y-3, 6, 6);
      Graphics.DrawRectangle(Pen, P2.X-3, P2.Y-3, 6, 6);
      Graphics.DrawEllipse(Pen, C1.X-3, C1.Y-3, 6, 6);
      Graphics.DrawEllipse(Pen, C2.X-3, C2.Y-3, 6, 6);
    
      Pen.Color := $FFC0C0C0;
      Graphics.DrawLine(Pen, P1, C1);
      Graphics.DrawLine(Pen, P2, C2);
    end;
    
    //把一条当作多条画(DrawBeziers), 结果同上
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Pts: array[0..3] of TGPPoint;
    begin
      Pts[0].Initialize(30, 100);
      Pts[1].Initialize(120, 10);
      Pts[2].Initialize(170, 150);
      Pts[3].Initialize(220, 80);
    
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FF0000FF, 2);
    
      Graphics.DrawBeziers(Pen, Pts);
    
      Pen.Width := 1;
      Pen.Color := $FFFF0000;
      Graphics.DrawRectangle(Pen, Pts[0].X-3, Pts[0].Y-3, 6, 6);
      Graphics.DrawRectangle(Pen, Pts[3].X-3, Pts[3].Y-3, 6, 6);
      Graphics.DrawEllipse(Pen, Pts[1].X-3, Pts[1].Y-3, 6, 6);
      Graphics.DrawEllipse(Pen, Pts[2].X-3, Pts[2].Y-3, 6, 6);
    
      Pen.Color := $FFC0C0C0;
      Graphics.DrawLine(Pen, Pts[0], Pts[1]);
      Graphics.DrawLine(Pen, Pts[3], Pts[2]);
    end;
    

    DrawBeziers 测试图:



    DrawBeziers 测试代码:

    uses GdiPlus;
    
    const
      Pts: array[0..6] of TGPPoint = (
        (X: 24; Y: 32), // Pt1
        (X: 16; Y: 88), // C1
        (X: 36; Y:132), // C2
        (X:120; Y: 20), // Pt2
        (X:180; Y:150), // C3
        (X:210; Y: 90), // C4
        (X:210; Y: 20)  // Pt3
      );
    
    //两条 Bezier 线需要 7 个点, 而不是 8 个; 因为 Bezier1 的终点即是 Bezier2 的起点;
    //多条 Bezier 线需要的点数 = 3 * 线数 + 1;
    //数组 ID 能被 3 整除的点是端点, 其他是控制点
    procedure TForm1.FormPaint(Sender: TObject);
    var
      Graphics: IGPGraphics;
      Pen: IGPPen;
      Brush: IGPBrush;
      Rect: TGPRect;
      i: Integer;
    begin
      Graphics := TGPGraphics.Create(Handle);
      Pen := TGPPen.Create($FFFF0000, 2);
      Brush := TGPSolidBrush.Create($800000FF);
    
      Graphics.DrawBeziers(Pen, Pts);
    
      for i := 0 to Length(Pts) - 1 do
      begin
        Rect.Initialize(Pts[i].X - 4, Pts[i].Y - 4, 8, 8);
        if i mod 3 = 0 then
          Graphics.FillRectangle(Brush, Rect)
        else
          Graphics.FillEllipse(Brush, Rect);
      end;
    end;
    
  • 相关阅读:
    [转]只有程序员才能看懂的幽默
    论安防集成管理平台规范标准建设的重要性和必要性
    视频集成技术演进与创新实践
    (转)jQuery中Ajax事件beforesend及各参数含义
    (转)如何打一手好Log
    marquee标签
    如何学习Git,如何使用Git
    学习vue
    python安装教程
    Jmeter压力测试(入门篇)
  • 原文地址:https://www.cnblogs.com/del/p/1625966.html
Copyright © 2011-2022 走看看