0

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

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

是否可以将整行保存为对象?

原因是,我需要编写一个非常基本的 Drawtool,它应该有一个“撤消”功能。目前我将点保存在一个数组中,如果用户按下反斜杠键,则将它们过度绘制为白色,但性能非常缓慢,它会颤抖。

另外,我可能想为拖放线添加可能性,如果将线保存在对象中,这会容易得多。

提前感谢。

4

1 回答 1

2

你可以这样做,但你应该在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的 s 列表并在需要时绘制它们:

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

Invalidate()当您的对象发生任何更改(新行、删除行、移动行等)时调用面板的方法。

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

于 2013-03-05T12:53:22.493 回答