所以我正在制作一个绘画应用程序,我想知道如何保留我绘制的线条的粗细。因此,我的应用程序使用绘制的所有线条的点列表列表,并在用户每次绘制新线时再次绘制它们。现在我有一个问题,当我改变笔的大小时,所有线条的大小都会改变,因为它们都被重新绘制了。
我的代码:
//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(( 在循环期间更改笔的大小,但我如何保留线宽?
而不是List<List<Point>>
,编写一个具有List<Point>
和笔宽的类,并使用其列表。我们也会加入颜色,但你可以省略它。
public class MyPointList {
public List<Point> Points { get; set; }
public float PenWidth { get; set; }
public Color Color { get; set; }
}
将"上一个点"作为这些列表:
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
块处理笔。
正如凯尔在评论中指出的那样,你也可以给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);
}
写十几个不同的子类,画圆圈,弧线,棒棒猫,等等。