保留笔尺寸?

时间:2017-06-12 19:15:06

标签: c# graphics

所以我正在制作一个绘画应用程序,我想知道如何保留我绘制的线条的粗细。因此,我的应用程序使用所有绘制线条的列表列表,并在每次用户绘制新线条时再次绘制它们。现在我有一个问题,当我改变笔的大小时,所有行的大小都会改变,因为它们都被重绘了。

我的代码:

        //Create new pen
        Pen p = new Pen(Color.Black, penSize);
        //Set linecaps for start and end to round
        p.StartCap = LineCap.Round;
        p.EndCap = LineCap.Round;
        //Turn on AntiAlias
        e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
        //For each list of line coords, draw all lines
        foreach (List<Point> lstP in previousPoints)
        { 
            e.Graphics.DrawLine(p, lstP[0], lstP[1]);
        }
        p.Dispose();

我知道可以使用Pen.Width()在循环期间更改笔的大小但是如何保留线宽?

1 个答案:

答案 0 :(得分:3)

而不是List<List<Point>>,写一个具有List<Point>和笔宽的类,并使用它的列表。我们也会投入颜色,但你可以省略它。

public class MyPointList {
    public List<Point> Points { get; set; }
    public float PenWidth { get; set; }
    public Color Color { get; set; }
}

将previousPoints列为:

private List<MyPointList> previousPoints;

循环:

foreach (MyPointList lstP in previousPoints) {
    using (var p = new Pen(lstP.Color, lstP.PenWidth)) {
        e.Graphics.DrawLine(p, lstP.Points[0], lstP.Points[1]);
    }
}

using块处理笔。

正如Kyle在评论中指出的那样,你也可以给MyPointList一个绘制方法。

实际上,您可以使用抽象或虚拟Draw(Graphics g)方法编写基类:

public abstract class MyDrawingThing {
    public abstract void Draw(Graphics g);
}

public class MyPointList : MyDrawingThing {
    public List<Point> Points { get; set; }
    public float PenWidth { get; set; }
    public Color Color { get; set; }

    public override void Draw(Graphics g) {
        using (var p = new Pen(Color, PenWidth)) {
            g.DrawLine(p, Points[0], Points[1]);
        }
    }
}

......并使用如下:

private List<MyDrawingThing> previousPoints;

foreach (MyDrawingThing thing in previousPoints) {
    thing.Draw(e.Graphics);
}

写一些不同的子类,绘制圆圈,弧线,lolcats等等。