设置 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 的线端样式的主要内容,如果未能解决你的问题,请参考以下文章