所以我正在制作一个绘画应用程序,我想知道如何保留我绘制的线条的粗细。因此,我的应用程序使用所有绘制线条的列表列表,并在每次用户绘制新线条时再次绘制它们。现在我有一个问题,当我改变笔的大小时,所有行的大小都会改变,因为它们都被重绘了。
我的代码:
//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()在循环期间更改笔的大小但是如何保留线宽?
答案 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等等。