操作历史 - 撤销和重做
一个有用的撤销/重做系统,可以轻松地集成到大多数程序中。
引言
不久前,我决定需要为我的程序添加撤销和重做功能。 我考虑了一会儿,并决定如果我创建某种可以轻松派生的接口,将会变得更容易。 每次用户执行任何操作时,都会向一个`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`运算符创建的操作类实例。
如果您有兴趣使用它,我建议您首先仔细查看演示。
我没有看到此方法有任何问题,但我不是专家,可能还有更好的方法。 我希望这篇文章对您有所帮助。
关注点
当我考虑实现撤销/重做系统时,我发现了接口的使用; 从那时起,我的编程结构就变得更加规范了。
历史
未进行任何更改。