61_命令设计模式(栈撤销重做)

作业讲解

选中手动判断点是否在矩形范围内,Crect.PtInRect,应该使用NormalizeRect先规范化

Remarks

Determines whether the specified point lies within CRect. A point is within CRect if it lies on the left or top side or is within all four sides. A point on the right or bottom side is outside CRect.

Note   The rectangle must be normalized or this function may fail. You can call NormalizeRect to normalize the rectangle before calling this function.

撤销重做

命令模式设计:动作是可以被封装,保存,传递,执行,反执行

命名方式

IDongzuo == ICommand

CAddDongzuo == CaAdCommand

CMoveDongzuo == CMoveCommand

图形类两个栈保存撤销和重做

移动

Class CMove

{

Public:

Void UnExec() //把图形移动回去

{

m_pMoveShape->move

}

Private:

IShapeBase * m_pMoveShape; //被选中的图形

CPoint m_ptMoveBegin;;

CPoint m_ptMoveEnd;

}

鼠标抬起的时候添加进撤销栈

快捷键消息撤销栈,保存撤销的操作到重做栈

快捷键消息重做栈,弹出栈顶调用移动图形,保存操作到撤销栈

添加图形

抽象添加动作类

类成员:保存图形的链表, 当前图形,实现虚函数

图形类在右键弹起的时候执行动作类添加

旋转

封装旋转动作类

抽象动作类:执行东西与执行动作前接口

图形类链表存放改成抽象动作类的指针

修改选中抽象图形类指针为空

修改鼠标按下弹起与相应菜单

判断点击坐标和弹起坐标是否相同,如果相同才入栈

作业

删除修改画笔画刷

https://github.com/xkkhh/Cracking/tree/master/08CAD05

 

0 条评论
发表一条评论