将绘制的线条保存为对象

本文关键字:保存 对象 绘制 | 更新日期: 2023-09-27 18:02:13

是否有可能保存我用图形创建的东西?例如:

Graphics g = PanelOne.CreateGraphics();
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.DrawLine(p, beginn, end);

是否可以将整行保存为Object?

的原因是,我需要编程一个非常基本的Drawtool,这应该有一个"撤消"功能。目前,我将点保存在一个数组中,如果用户按下反斜杠键,就会透支它们,但是性能非常慢,它会抖动。

我可能还想添加拖放线条的可能性,如果将线条保存在对象中,这将容易得多。

将绘制的线条保存为对象

您可以这样做,但是您应该在Paint方法中绘制所有对象:

public abstract class DrawingObject
{
    public abstract void Draw(Graphics g);
}
public class Line : DrawingObject
{
    public Point Start { get; set; }
    public Point End { get; set; }
    public float Thickness { get; set; }
    public Color Color { get; set; }
    public override void Draw(Graphics g)
    {
        g.DrawLine(new Pen(Color, Thickness), Start, End);
    }
}
// Other classes derived from `DrawingObject`

在表单中存储DrawingObjects列表,并在需要时绘制它们:

public partial class MainForm : Form
{
    //...
    List<DrawingObject> _objects = new List<DrawingObject>();
    private void PanelOne_Paint(object sender, PaintEventArgs e)
    {
        base.OnPaint(e);
        foreach (var o in _objects)
        {
            o.Draw(e.Graphics);
        }
    }
}

调用panel的Invalidate()方法,当任何变化发生在你的对象(新线,删除一条线,移动一条线,等)。

为了避免绘图时闪烁,可以将面板的DoubleBuffer属性设置为true