重构的原理:当我们通过“_actionLink”记录每一步操作数据是否"脏"的状态后,wxMyPainterFrame中的“_is_dirty”将变成多余的,同样wxMyPainterFrame中的SetDirty方法也是多余的
重构的步骤:
1. WxMyPainterMain.cpp中调用SetDirty(……)的地方,全部改为UpdateFileStatusUI(),包括我们在“Undo/Redo”响应函数中加上的那两行
这些位置分别在下面的函数中
//鼠标抬起函数
void wxMyPainterFrame::OnScrolledWindow1LeftUp(wxMouseEvent& event)
//置顶
void wxMyPainterFrame::OnMenuItemTopLevelSelected(wxCommandEvent& event)
//上浮
void wxMyPainterFrame::OnMenuItemFowardLevelSelected(wxCommandEvent& event)
//下降
void wxMyPainterFrame::OnMenuItemBackLevelSelected(wxCommandEvent& event)
//置底
void wxMyPainterFrame::OnMenuItemBottomLevelSelected(wxCommandEvent& event)
//删除
void wxMyPainterFrame::OnMenuItemDelItemSelected(wxCommandEvent& event)
//隐藏
void wxMyPainterFrame::OnMenuItemHideSelected(wxCommandEvent& event)
//Undo
void wxMyPainterFrame::OnMenuItemEditUndoSelected(wxCommandEvent& event)
//Redo
void wxMyPainterFrame::OnMenuItemEditRedoSelected(wxCommandEvent& event)
2. 原来需要判断“_is_dirty”的地方,都改成判断“_actionLink.IsDirty()”
易错点:替换的时候,818行的叹号容易忽略掉,忽略了,后面会出问题
3.完成修改之后,从类wxMyPainterFrame的定义及实现代码中,将_is_dirty和SetDirty()删除
运行效果:
重构之后,窗口上的标题的 * 是由基类EditAction的私有成员 _is_dirty决定的,
以添加新图元为例,演示一下,EditAction的私有成员 _is_dirty是如何起作用的:
打上断点
开始调试:
step into
继续 step into
上一步,将基类EditAction的私有成员 _is_dirty设置为true,继续往下调试
此时的窗口如下
再向前执行一步:
此时,可以看到窗口的标题已经发生变化了:
程序启动后,画一条直线,可以看到窗口标题上带有一个 *
然后将直线撤销,可以发现窗口上的 * 不见了
这是因为,如果只是添加一个图元,那么Undo之后,_iter后退一步,指向EmptyAction,而EmptyAction的_is_dirty为false,所以Undo之后,窗口标题的*会消失
然后,再恢复,可以看到窗口标题上的“*”又出现了