epo2001
epo2001

Reputation: 9

Drawing form path on canvas

How it is possible to draw a form like this with path:

Expected result

The drawing of the arc in the opposite direction gives a wrong effect. Somebody have may be an idea. The moveto apparently is taken consideration.

Rreceived result

Code:



    procedure TForm1.PaintBox1Paint(Sender: TObject);
    var
      iTop, iHeight: Integer;
      iLeft,iWidth : Integer;
      iC: Integer;
      h,w: Integer;
      Canvas: TCanvas;
    
      procedure DrawPathEnveloppeExt(ACanvas: TCanvas; const AiLeft, AiTop, AiRight, AiBottom, AiC: Integer; AiPivotX, AiPivotY: Integer);
      begin
        ACanvas.MoveTo(AiLeft,AiTop + AiC);
        ACanvas.LineTo(AiLeft,AiBottom - AiC);
        ACanvas.ArcTo( AiLeft, AiBottom -(AiC*2), AiLeft + (AiC*2), AiBottom,   AiLeft, AiBottom - AiC, AiLeft + AiC,AiBottom );
        ACanvas.LineTo(AiPivotX-AiC,AiBottom);
        ACanvas.ArcTo(AiPivotX-(2*AiC),AiBottom -(2*AiC), AiPivotX, AiBottom, AiPivotX - AiC, AiBottom, AiPivotX, AiBottom - AiC);
        ACanvas.LineTo(AiPivotX ,AiPivotY + (AiC));
        ACanvas.MoveTo(AiPivotX + AiC, AiPivotY );
        ACanvas.Arc(AiPivotX,AiPivotY, AiPivotX + (2*AiC), AiPivotY + (2*AiC),  AiPivotX + AiC, AiPivotY, AiPivotX , AiPivotY+ AiC);
        ACanvas.MoveTo(AiPivotX + AiC, AiPivotY);
        ACanvas.LineTo(AiRight-AiC,AiPivotY);
        ACanvas.ArcTo(AiRight-(2*AiC),AiPivotY -(2*AiC),AiRight,AiPivotY, AiRight-AiC,AiPivotY, AiRight,AiPivotY - AiC);
        ACanvas.LineTo(AiRight,AiTop + AiC);
        ACanvas.ArcTo(AiRight-(AiC*2),AiTop,AiRight,AiTop+(2*AiC),AiRight,AiTop + AiC,AiRight-AiC,AiTop);
        ACanvas.LineTo(AiLeft+ AiC,AiTop);
        ACanvas.ArcTo(AiLeft,AiTop,AiLeft+(2*AiC),AiTop + (2*AiC), AiLeft + AiC ,AiTop,AiLeft,AiTop+ AiC);
        CloseFigure(ACanvas.Handle);
      end;
    
    
    begin
      h := PaintBox1.ClientHeight;
      w := PaintBox1.ClientWidth;
    
      iC      := 15;
      iTop    := 35;
      iHeight := 165;
      iLeft   := 50;
      iWidth  := 250;
    
    
      Canvas := PaintBox1.Canvas;
    
      BeginPath(Canvas.Handle);
      DrawPathEnveloppeExt(Canvas, iLeft, iTop, iLeft + iWidth, iTop + iHeight, iC, 200,120);
      EndPath(Canvas.Handle);
    
      Canvas.Brush.Color := clLime;
      Canvas.Brush.Style := bsSolid;
      Canvas.Pen.Width   := 2;
      Canvas.Pen.Color   := clGrayText;
      StrokeAndFillPath(PaintBox1.Canvas.Handle);
    end;
    
    

Any idea?

Thanks a lot

Upvotes: 1

Views: 743

Answers (1)

MBo
MBo

Reputation: 80187

Seems you have changed start and end points and ignored arc direction. This code draws figure as needed:

ACanvas.LineTo(AiPivotX ,AiPivotY + (AiC)); //6-th line of your procedure

SetArcDirection(ACanvas.Handle, AD_CLOCKWISE);
ACanvas.ArcTo(AiPivotX,AiPivotY, AiPivotX + (2*AiC), AiPivotY + (2*AiC),  AiPivotX, AiPivotY + AiC, AiPivotX + AiC , AiPivotY);
SetArcDirection(ACanvas.Handle, AD_COUNTERCLOCKWISE);

ACanvas.LineTo(AiRight-AiC,AiPivotY); //10-th line of your procedure

Upvotes: 4

Related Questions