【问题标题】:Drawing multiple lines with DrawLines and DrawLine produces different result用 DrawLines 和 DrawLine 绘制多条线会产生不同的结果
【发布时间】:2013-05-21 13:41:10
【问题描述】:

我正在尝试在绘图事件中使用它的图形对象在 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);
        }
    }

这会产生如下图所示的结果,

正如您所见,在急转弯处绘制的线条有一点延伸,这是意料之中的。因此,我将绘制线代码更改为,

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]);
}

现在绘图工作正常。

谁能说出这两种方法的区别?

【问题讨论】:

    标签: winforms graphics paint


    【解决方案1】:

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

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

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

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

    现在 DrawLines 不再超出点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      相关资源
      最近更新 更多