为Canvas.LineTo设置lineend样式

时间:2008-12-15 13:59:17

标签: delphi winapi gdi

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

看起来像这样(圆形末端):

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

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

如果在中线之后画出两条外线,那就更糟了:

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

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

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

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

3 个答案:

答案 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.....