【发布时间】:2016-11-12 19:08:46
【问题描述】:
我正在尝试创建一个具有撤消和重做功能的简单绘图应用程序。我假设您可以将您正在绘制的内容添加到列表中并调用列表来绘制所有内容。然后撤消应该只删除最后添加的项目并重新绘制所有内容。问题是,如何将我绘制的内容添加到列表中并使用该列表撤消?
我正在使用位图重绘方法。 我就是这样画的:
Point start, end;
bool painting;
private List<PointF> myPoints = new List<PointF>();
private void pnlMain_MouseDown(object sender, MouseEventArgs e)
{
start = e.Location;
painting = true;
}
private void pnlMain_MouseUp(object sender, MouseEventArgs e)
{
painting = false;
}
private void pnlMain_MouseMove(object sender, MouseEventArgs e)
{
if (painting == true)
{
end = e.Location;
g.DrawLine(p, start, end);
myPoints.Add(e.Location);
pnlMain.Refresh();
start = end;
}
}
private void btnUndo_Click(object sender, EventArgs e)
{
g.Clear(cldFill.Color);
if (myPoints.Count > 2)
{
myPoints.RemoveAt(myPoints.Count - 1);
g.DrawCurve(p, myPoints.ToArray());
}
pnlMain.Refresh();
//This works but you have to spam it to get rid of
//a line and does some weird connections.
}
【问题讨论】:
-
您需要收集您在
List<T>中绘制的坐标。有关如何收集它们的代码,请参阅我的comments here!另外:你画错了。您似乎缓存了一个 Graphics 对象。这是错误的!在 Paint 事件中绘制所有内容! -
是的,没问题。如果你实现了我在(all) my comments I linked to 中给出的代码,你只需要添加一个按钮点击
curves.Remove(curves.Last)); pnlMain.Invalidate();