Undo/Redo设计(四)

 2.5        排列操作
排列操作可细分为水平/垂直方向的最小、最大、中间、等距及窗口中点方式。同样,基于撤销与重做需求来处理其额外信息。
若要撤销排列操作,则需记住排列前各对象的位置,如其上端、左端、中心点值等信息,当然,记住其中一个信息即可。
是吗?如果是水平方向排列,记住左端当然可以撤销,但对于垂直方向而言,毫无意义。
因此,应该记下中心点值信处,这样,水平垂直方向都可以撤销。
嗨,中心点值是二维的,而上端或左端只是一维的,当然是不等价的。如果不记中心点值,同时记下左端与上端信息,效果才是一样一样的。
若要重做排列操作,呃,好象不需要处理什么,只需再排列一次即可。
基于此分析,应在开始排列之前记录所选对象的位置信息,故可在TCbwExecuteItem::SetOperateObject中处理,即直接加入流入XML节点处理

撤销时处理代码:

重做时代码:

运行查看结果,结果撤销时,导线出现小问题,即不能全部恢复原始状态。
下图显示的是具体运行效果,左图为原始状态,中图为水平左端对齐,右图为撤销结果。可以看到,撤销后,导线没有处理好。
看来还需要专门处理一下导线。
为了能撤销到原始状态,则需把相关的导线全部取出来。所幸软件是自己编的,要什么东东都可以很方便地取得。以前的函数AllConnectedObjects现在可又多了一个用处。
思路继续,在操作时,取得了相关的导线,然后将它们的信息保存,在撤销时,再取得现在的相关导线,全部删除,再恢复以前的相关导线,万事就OK了。
重做呢?哦,既然已回到起点,结果状态又是排列过程算出来的,就不用再处理了。
编程试试。

再运行检查,得到了期望的结果。
下图中,第一张图为原始图,全选后左对齐得到第二张图,再上对齐得到第三张图,撤销得到第四张图,再撤销得到第五张图。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值