可视化C++撤消和重做操作



我有一个相当大的应用程序,我正在尝试在视觉C++中制作,我现在正在尝试添加撤消/重做功能。

有相当多的事件(按钮单击、标签文本更改等(,我想找到一种方法来撤消/重做,而无需为每个函数添加代码。例如,我想要一个可以读取完成的每个事件并自动存储它的类。然后在我的撤消/重做事件中,我可以存储最新的操作。

如果这是不可能的,我不介意其他方式。

有什么帮助吗?

声明一个表示两个操作的类 - 撤消和重做。还要创建该类的两个向量。

对于要应用撤消/重做的每个操作,将该类的实例推送到撤消向量中。应该有与要撤消的操作一样多的派生类。

例如,如果单击按钮将背景绘制为绿色,则会创建一个类实例,其撤消 metdho 将背景绘制为以前的颜色,其重做方法将背景绘制为绿色,并将其填充到撤消向量中。撤消时 - 弹出最后一个类实例并调用其撤消方法,该方法会将背景绘制为以前的颜色。然后将其推送到重做向量。

当你重做时,你在顶部弹出类实例的重做向量并调用它的重做方法,他们把它塞回撤消向量。

有一些极端情况(边界(,遇到时你会解决它们。 :-(

是否所有事件都通过某种队列? 默认情况下,在 C++ 中没有这样的队列(有一个 Windows 操作系统级别的事件队列,但它可能已经管理并且在 C++-CLI 中不可用,并且您没有指出这是否紧密映射到您的问题(,可能还有其他一些我不知道的结构。

如果您有一些中央队列,那么只需在事件通过时捕获事件并知道如何撤消每个操作即可。如果不存在中央队列,那么我认为没有其他方法比更改每个可撤消函数以创建某种撤消对象并将其存储在某种撤消队列中和撤消队列更容易。

在没有大型中央工作队列的纯 .net 或C++环境中,我会创建一个 is 和 undo 条目的类,它实现一个方法来撤消和另一个方法来重做/做工作。但对于撤消功能,这可能只是一个 .net 委托或 c 样式函数指针,以及参数列表。如果您创建操作撤消/重做类,它可以是存储指向 do 和撤消函数的指针/委托的模板或泛型,以及最初调用时的参数列表。

可以运行这些操作以撤消已完成的操作。它们将入到某种队列容器中,这种容器似乎并不重要,只要它保持顺序,你应该为你的应用程序选择最好的 std、.net 或其他容器。当您不再需要较旧的时,可以丢弃它们。执行时,必须删除最后插入队列的条目以保持一致性。

如果您还需要重做功能,那么您完成的操作队列必须是可迭代的,并且最简单的方法是使用曾经的类,并且操作具有可以撤消/重做所需操作的方法/成员函数。您将拥有某种类型的迭代器,指针,索引或标记,指示您撤消了多远。每次请求撤消时,都必须向后移动标记(按时间顺序(,并在队列中的该点执行撤消命令。如果请求重做,则指示的当前项执行其重做指令,然后迭代器在队列中向前推进(按时间顺序(,或者如果您位于队列中最前沿的项目,则忽略(我假设(。

如果你想离开深端,你没有办法表明你想要,你可以围绕操作队列来中心你的应用程序。您可能不需要更改实现此方法的函数。您的用户界面(我假设,可以很容易地成为您的API(函数,将操作(支持执行和撤消(插入队列,然后命令队列执行。如果现有函数的副作用已知且可逆,则不必更改现有功能。但是,您需要更改所有调用方以执行操作而不是直接调用,并且需要编写执行撤消操作的对应项。

我试图在一个小型实验库中实现类似的东西:https://github.com/d-led/undoredo-cpp。它包含一个类似于CodeChords人建议的TransactionStore的实现。您可能需要真正为每个可撤消的对象添加功能,并且还要注意对象的生存期,以防您的操作涉及对象构造或销毁

最新更新