如何实现Image控件下的Undo功能?(50分)

  • 主题发起人 主题发起人 pogoo
  • 开始时间 开始时间
P

pogoo

Unregistered / Unconfirmed
GUEST, unregistred user!
请问:我在Delphi的Image控件下画了一条直线,但以后我又想去掉这条直线,类似于Undo的功能,我应该如何实现呢?谢谢各位!
 
1.先拷贝画直线之前的Image
2.Undo时再把她画会来
 
Var
AUndoPicture:TPicture;
.....

Function BeforDraw(..)
begin
AUndoPicture.assign(image1.picture.assign);
end;
Function Undo(..)
begin
image1.picture.assign(AUndoPicture);
end;

不过图象很大时会慢一点点。
实现多级Undo可以管理一个UndoPicture的列表
 
设置光栅模式为异或
Canvas.Pen.Mode:=pmNotXor;

重新画一次线就可以了
 
我的方法是你在Image上面放一个PaintBox先画到PaintBox上去
如果继续修改图像,就把刚刚的那一笔画到Image上,如果Undo就不动Image
直接PaintBox刷新
所以这种方法需要纪录上次操作的内容,系统消耗比较少,不过只能Undo一步
如果多步的话Nose的方法不错:)
速度还可以Delphi自己带了的例子,不过我没仔细看:=)
 
创建临时图形可以,当然大了就不行乐。
 
若在图上只是画简单直线、圆等,就用异或操作(如cheka所说);
若是在图上进行复杂的修改,就用提取保留的图像的方法。
 
如果想可以多次uodo,还是保留中间结果
 
重新画一次线就可以了 ”

这样你可以 UNDO 很多次(递推往前)。

如果你要提取中间结果 ----- 要麻烦一点 ----- 你要开一个窗口
你先要查询你要删除哪次画图操作,再确定是否要删(我正在编类似的
程序,不然就有现成的原代码贴给你了); 而且,你可能要记录下每
次操作的顺序,这个信息可以写到前面开辟的“格式字符串”中
 
我少贴了前半段:


你可以设计一种格式字符串,把操作中用到的数据依次存到里面,
用数组 或memo?.lines[?]存储 -- 备用

在你想删除上一次操作时,
先取出上一次操作的数据,按 CHEKA 的方法:
“ 设置光栅模式为异或
Canvas.Pen.Mode:=pmNotXor;
重新画一次线就可以了 ”
 
多人接受答案了。
 
后退
顶部