wxMyPainterFrame类定义中声明新的成员:

增加一个全局变量,初始化新成员:

先实现TrySaveFile()

SaveFile()暂时为空实现

增加两个新的私有成员方法:

wxMyPainterFrame类中,修改了“_items”的几个地方
① 鼠标抬起时,添加新元素;
② 删除事件;
③ 置顶,上浮一层,下沉一层,置底四个事件中,修改了元素位置;
④ 隐藏事件中,修改了元素的可视属性。
在这几个地方,调用SetDirty(true)
添加新图元时:

删除图元时


隐藏图元时:

调整次序时:
OnMenuItemTopLevelSelected(wxCommandEvent& event) OnMenuItemFowardLevelSelected(wxCommandEvent& event) OnMenuItemBackLevelSelected(wxCommandEvent& event) OnMenuItemBottomLevelSelected(wxCommandEvent& event)
这四个函数的最后,加上对SetDirty(true)的调用
修改基类EditAction,增加一个_is_dirty的属性

修改嵌套类EmptyAction,增加一个构造函数

基类EditAction的IsDirty和SetDirty方法一个用于查询,一个用于修改,但外部调用实际是通过ActionLink对象作为入口,所以需要为后者也添加类似的接口:


回到主窗口的代码,当有人调用Undo或Redo时,我们就从Action链表中查询一下,新到达的节点位置,记录的状态是什么

对应的,SaveFile()操作,需要添加上ActionLink的Save操作,以便及时记录“此刻数据不脏”的状态:

运行效果:




















