使用DrawLines和DrawLine绘制多条线会产生不同的结果

时间:2013-05-21 13:41:11

标签: winforms graphics paint

我正在尝试使用paint事件中的图形对象在winforms面板上绘制多条线。我实际上绘制了许多连接给定点的线。所以,首先我做了这个,

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawLines(new Pen(new SolidBrush(Color.Crimson), 3), PointFs.ToArray());
        float width = 10;
        float height = 10;
        var circleBrush = new SolidBrush(Color.Crimson);
        foreach (var point in PointFs)
        {
            float rectangleX = point.X - width / 2;
            float rectangleY = point.Y - height / 2;
            var r = new RectangleF(rectangleX, rectangleY, width, height);

            e.Graphics.FillEllipse(circleBrush, r);
        }
    }

产生如下图所示的结果

enter image description here

正如你所看到的那样,在急转弯时画出了一点延伸线,这是不可预期的。所以,我将drawlines代码更改为,

var pen = new Pen(new SolidBrush(Color.Crimson), 3);
for (int i = 1; i < PointFs.Count; i++)
{
    e.Graphics.DrawLine(pen, PointFs[i - 1], PointFs[i]);
}

现在绘图效果很好。

enter image description here

有人能说出这两种方法的区别吗?

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题(在我的研究中偶然发现了这个问题),但我现在找到了解决方案。

问题是由Pen使用的LineJoin属性引起的。这个DevX页面解释了不同的LineJoin类型(插图见图1)。似乎斜接是默认类型,当你有锐角时会导致“过冲”。

我通过将LineJoin属性设置为Bevel来解决我的问题:

var pen = new Pen(new SolidBrush(Color.Crimson), 3);
pen.LineJoin = Drawing2D.LineJoin.Bevel;

现在,DrawLines不再超过这些点。