设置 Canvas.LineTo 的线端样式

Posted

技术标签:

【中文标题】设置 Canvas.LineTo 的线端样式【英文标题】:Setting the Line End Styles for Canvas.LineTo 【发布时间】:2020-03-24 02:37:11 【问题描述】:

有没有什么方法可以为 TCanvas.LineTo 方法设置 lineends 的样式?它似乎默认为圆形末端,当 Pen.Width 设置为较大的值(例如 9)时,对于一行不同颜色的几行来说,这看起来非常糟糕。

看起来像这样(圆角):

 ********........******
**********........******
**********........******
 ********........******

(其中 * 是例如蓝色,. 是黄色)

如果把外面的两条线画在中间线之后就更糟了:

 ********........******
**********......********
**********......********
 ********........******

我希望它看起来像这样(直线结束):

 ********........******
 ********........******
 ********........******
 ********........******

Pen 似乎没有为此提供任何设置,LineTo 方法也没有。是否有我可以调用的 Windows API 函数?

【问题讨论】:

【参考方案1】:

也许ExtCreatePen 有帮助。检查PS_ENDCAP_*PS_JOIN_* 标志。

【讨论】:

这似乎是我正在寻找的,但它也不容易集成到 TCanvas 方法中。 看看这里:qc.codegear.com/wc/qcmain.aspx?d=9661。从未尝试过,但也许它在此期间有效?【参考方案2】:

来自DelphiPraxis forum (German language)的示例代码

procedure TForm1.FormCreate(Sender: TObject);
   var LogBrush:TLOGBRUSH;
begin
   ZeroMemory(@LogBrush, SizeOf(LogBrush));
   LogBrush.lbColor:=ColorToRGB(Canvas.Pen.Color);
   LogBrush.lbHatch:=0;

   DeleteObject(Canvas.Pen.Handle);
   Canvas.Pen.Handle:=ExtCreatePen(PS_Geometric or PS_Solid or PS_EndCap_Square or PS_Join_Miter, 10, LogBrush, 0, nil);
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
   Canvas.MoveTo(0, 0);
   Canvas.LineTo(50, 50);
end; 

【讨论】:

以上是关于设置 Canvas.LineTo 的线端样式的主要内容,如果未能解决你的问题,请参考以下文章

delphi Canvas画线问题

html 5 canvas LineTo() 线条颜色问题

ad过孔怎么搞?

matlab中的线样式颜色标记

Chartjs - 将图例更改为带有圆点样式的线?

allegro单板外形尺寸标注时怎么捕捉到线端两个端点