65.9K
CodeProject 正在变化。 阅读更多。
Home

操作历史 - 撤销和重做

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.20/5 (11投票s)

2004年3月7日

MIT

2分钟阅读

viewsIcon

45859

downloadIcon

1234

一个有用的撤销/重做系统,可以轻松地集成到大多数程序中。

Sample Image

引言

不久前,我决定需要为我的程序添加撤销和重做功能。 我考虑了一会儿,并决定如果我创建某种可以轻松派生的接口,将会变得更容易。 每次用户执行任何操作时,都会向一个`std::vector`列表添加一个新操作,并且这些指令可以被您的程序解释。 我建议尽可能保持有关指令的存储数据量最小。

使用代码

基本上,对于您的程序可以执行的任何操作(您希望撤销或重做),您可以创建一个从接口`IActionBase`派生的类。 该接口包含一个运行函数,该函数应包含完成操作的代码,然后是一个撤销函数,该函数应包含再次撤销操作的代码。

演示项目的主窗口包含一个可以在屏幕上拖动的框。 每次您完成一个拖动周期(释放鼠标)后,您就可以单击“撤销”按钮。 我还在“编辑”菜单下插入了一个选项,您可以使用该选项清除撤销/重做历史记录。

从技术上讲,使用此系统,您可以实现类似于 Adobe Photoshop 中的某种历史记录功能,以便您可以恢复到历史记录中的特定点。

要使用此系统,请在`CMainFrame`类中声明`CActionHistory`类的实例(如果您使用的是 MFC)。 我建议您公开声明它,以便于访问,尤其是在从`CView`派生的类中。 然后,对于您的程序执行的每个操作,从接口`IActionBase`派生一个类。 然后您只需要创建并将操作添加到接口。 请注意,`CActionHistory`的`AddAction`成员函数不会运行该操作。 您必须单独运行该操作。 这是一个关于其用法的简短示例

// create a new action for dragging the box
CActionDragBox* pNewAction = new CActionDragBox(&m_rtBox, this);
// you can run the action whenever you want using the pointer
pNewAction->Run();
// add this actions to the history list
pMainFrm->m_ActionHistory.AddAction(pNewAction);

`CActionHistory`类将负责清理使用`new`运算符创建的操作类实例。

如果您有兴趣使用它,我建议您首先仔细查看演示。

我没有看到此方法有任何问题,但我不是专家,可能还有更好的方法。 我希望这篇文章对您有所帮助。

关注点

当我考虑实现撤销/重做系统时,我发现了接口的使用; 从那时起,我的编程结构就变得更加规范了。

历史

未进行任何更改。

© . All rights reserved.