【问题标题】:Drawing form path on canvas在画布上绘制表单路径
【发布时间】:2017-10-26 16:37:14
【问题描述】:

如何用路径绘制这样的表格:

在相反方向绘制圆弧会产生错误的效果。有人可能有一个想法。显然已经考虑到了这一举动。

代码:

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;

有什么想法吗?

非常感谢

【问题讨论】:

    标签: delphi vcl


    【解决方案1】:

    您似乎更改了起点和终点并忽略了弧线方向。此代码根据需要绘制图形:

    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
    

    【讨论】:

    • 当然,我已经按这个顺序设置了起点/终点,因为无法做到预期的数字。您可以同意,如果我反转起点/终点,圆弧变为 270° .我尝试使用 moveto 来获得正确的效果。在这种情况下,问题变成了:是否可以使用开始/结束路径绘制这样的图形?感谢您的帮助。
    • Em... 我的代码更正给出了正确的数字。注意 - 我交换了开始/结束,使用 ArcTo 并使用 SetArcDirection 来避免 270-arc。
    • 你完全正确。这是一个很好的解决方案。抱歉,您的回复读得太快了..
    猜你喜欢
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 2022-01-10
    • 2021-06-25
    • 2015-10-24
    • 2013-12-20
    相关资源
    最近更新 更多