撤消问题&重做选项 [英] Problem With Undo & Redo Option

查看:75
本文介绍了撤消问题&重做选项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我创建了一个项目,通过用户移动鼠标绘制椭圆

和2个按钮撤消&重做



撤消工作o.k.

但我有重做选项的问题



如果我绘制3个圆圈

然后点击两次在撤消按钮上我删除了2个圆圈并留下了第一个圆圈

这很棒

但是当我点击重做按钮一次我想要返回第二个圆圈时我画画

但是我得到了2圈(第2和第3张也是最后一张)



这里是我的代码



Hey
i have created a project that draw an Ellipse via movement of the mouse by the user
and 2 buttons Undo & Redo

The undo works o.k.
but i have a problem with the Redo option

if i draw 3 circles
and then click twice on the undo button i delete 2 circles and left with the first circle
which is great
but when i click the redo button once i want to return the second circle that i draw
but i get the insted the 2 circle (2th and 3th and final)

here is my code

namespace Final_Project___Undo_and_Redo
{
    public partial class Form1 : Form
    {
        private Bitmap PicInMemory; 
        private Graphics PaintOnMyPic;
        private int FirstX, FirstY;
        private Graphics PaintOnPanel;
        List<bitmap> UndoList;
        List<bitmap> RedoList;
        private bool UndoMade = false;
        private bool RedoMade = false;

        public Form1()
        {
            InitializeComponent();
            PicInMemory = new Bitmap(panel1.Width, panel1.Height);
            PaintOnPanel = panel1.CreateGraphics();
            PaintOnMyPic = Graphics.FromImage(PicInMemory);
            PaintOnMyPic.Clear(Color.White);
            UndoList = new List<bitmap>();
            RedoList = new List<bitmap>();
        }

        private void panel1_MouseDown(object sender, MouseEventArgs e)
        {
            FirstX = e.X;
            FirstY = e.Y;
        }

        private void panel1_MouseMove(object sender, MouseEventArgs e)
        {
            Pen MyPen = new Pen(Color.Aqua);
            if (e.Button == MouseButtons.Left)
            {
                    PaintOnPanel = panel1.CreateGraphics();
                    PaintOnPanel.DrawImage(PicInMemory, 0, 0);
                    PaintOnPanel.DrawEllipse(MyPen, FirstX, FirstY, e.X - FirstX, e.Y - FirstY);
            }
        }

        private void panel1_MouseUp(object sender, MouseEventArgs e)
        {
            UndoList.Add(new Bitmap(PicInMemory));
            Pen MyPen = new Pen(Color.Aqua);
            PaintOnMyPic = Graphics.FromImage(PicInMemory);
            PaintOnMyPic.DrawEllipse(MyPen, FirstX, FirstY, e.X - FirstX, e.Y - FirstY);
            PaintOnPanel = panel1.CreateGraphics();
            PaintOnPanel.DrawImage(PicInMemory, 0, 0);
            RedoList.Add(new Bitmap(PicInMemory));
        }

        private void BtnUndo_Click(object sender, EventArgs e)
        {
            if (UndoList.Count == 0)
            {
                BtnUndo.Enabled = false;
                return;
            }
            PicInMemory = UndoList[UndoList.Count - 1];
            PaintOnPanel = panel1.CreateGraphics();
            PaintOnPanel.DrawImage(PicInMemory, 0, 0);
            UndoList.RemoveAt(UndoList.Count - 1);
            UndoMade = true;
        }

        private void BtnRedo_Click(object sender, EventArgs e)
        {
            if (RedoList.Count == 0 || UndoMade == false)
            {
                BtnRedo.Enabled = false;
                return;
            }
            PicInMemory = RedoList[RedoList.Count - 1];
            PaintOnPanel = panel1.CreateGraphics();
            PaintOnPanel.DrawImage(PicInMemory, 0, 0);
            UndoMade = false;
        }
    }
}



感谢您的帮助


Thanks for the help

推荐答案

可能会有所帮助:

may be this will help:
var selectedItem = RedoList.First();
PicInMemory = selectedItem;
RedoList.RemoveAt(0)


我希望这可以帮到你:

首先,您的代码会在MouseUp事件中添加重做列表,因此当您撤消两次或更多时,然后使用重做列表中的最后一张图片重做。这将在第一次撤消之前重绘图片,所以我建议删除UndoMade变量

Hi, I wish this may help you:
Firstly, your code adds to redo list in MouseUp event so when when you undo twice or more and then redo with the last pic in your redo list. this will redraw the pic before the first undo so I suggest this with deleting UndoMade variable
int undo_times=0;
private void BtnUndo_Click(object sender, EventArgs e)
{
    if (UndoList.Count == 0)
    {
        BtnUndo.Enabled = false;
        return;
    }
    PicInMemory = UndoList[UndoList.Count - 1];
    PaintOnPanel = panel1.CreateGraphics();
    PaintOnPanel.DrawImage(PicInMemory, 0, 0);
    UndoList.RemoveAt(UndoList.Count - 1);
    undo_times+=1;
}

private void BtnRedo_Click(object sender, EventArgs e)
{
    if (RedoList.Count == 0 || undo_times == 0)
    {
        BtnRedo.Enabled = false;
        return;
    }
    PicInMemory = RedoList[RedoList.Count - undo_times];
    PaintOnPanel = panel1.CreateGraphics();
    PaintOnPanel.DrawImage(PicInMemory, 0, 0);
    undo_times-=1;
}



我最诚挚的祝福。


with my best wishes.


这篇关于撤消问题&amp;重做选项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆