第11章 GUI Page487 步骤二十七 “脏数据”与“新文档”状态维护 代码重构

重构的原理:当我们通过“_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之后,窗口标题的*会消失

然后,再恢复,可以看到窗口标题上的“*”又出现了

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值