有没有办法为TCanvas.LineTo方法设置lineends的样式?它似乎默认为圆形末端,当Pen.Width设置为较大的值(例如9)时,对于不同颜色的行中的几行看起来非常糟糕。
看起来像这样(圆形末端):
********........******
**********........******
**********........******
********........******
(其中*是例如蓝色,而。是黄色)
如果在中线之后画出两条外线,那就更糟了:
********........******
**********......********
**********......********
********........******
我希望它看起来像这样(直播结束):
********........******
********........******
********........******
********........******
Pen似乎没有为此提供任何设置,LineTo方法也没有。可能有我可以调用的Windows API函数吗?
答案 0 :(得分:5)
也许ExtCreatePen有帮助。检查PS_ENDCAP_*
和PS_JOIN_*
标记。
答案 1 :(得分:1)
来自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;
答案 2 :(得分:0)
我认为这不可能用Delphi,也许Windows API LineTo有更好的功能(在其他编程语言中,这通常被称为linecap或类似的东西)。
解决方法是在线的起点和终点绘制两个正方形,但这仅适用于水平/垂直线,您可以旋转其他线的正方形。
你也可以尝试使用OpenGL进行内绘,当使用glLineWidth上限不是圆角时,尽管它们仍然保持水平/垂直,即使对于这样的对角线:
........ .........
..xxxxx. ..x......
.xxxxx.. OpenGL way .xxx..... correct way (not quite exact, I hope you get it)
xxxxx... xxxxx....
xxxx.... xxxx.....