P pogoo Unregistered / Unconfirmed GUEST, unregistred user! 2000-04-30 #1 请问:我在Delphi的Image控件下画了一条直线,但以后我又想去掉这条直线,类似于Undo的功能,我应该如何实现呢?谢谢各位!
N Nose Unregistered / Unconfirmed GUEST, unregistred user! 2000-04-30 #2 1.先拷贝画直线之前的Image 2.Undo时再把她画会来
N Nose Unregistered / Unconfirmed GUEST, unregistred user! 2000-04-30 #3 Var AUndoPicture:TPicture; ..... Function BeforDraw(..) begin AUndoPicture.assign(image1.picture.assign); end; Function Undo(..) begin image1.picture.assign(AUndoPicture); end; 不过图象很大时会慢一点点。 实现多级Undo可以管理一个UndoPicture的列表
Var AUndoPicture:TPicture; ..... Function BeforDraw(..) begin AUndoPicture.assign(image1.picture.assign); end; Function Undo(..) begin image1.picture.assign(AUndoPicture); end; 不过图象很大时会慢一点点。 实现多级Undo可以管理一个UndoPicture的列表
C cheka Unregistered / Unconfirmed GUEST, unregistred user! 2000-04-30 #4 设置光栅模式为异或 Canvas.Pen.Mode:=pmNotXor; 重新画一次线就可以了
M mikecool Unregistered / Unconfirmed GUEST, unregistred user! 2000-04-30 #5 我的方法是你在Image上面放一个PaintBox先画到PaintBox上去 如果继续修改图像,就把刚刚的那一笔画到Image上,如果Undo就不动Image 直接PaintBox刷新 所以这种方法需要纪录上次操作的内容,系统消耗比较少,不过只能Undo一步 如果多步的话Nose的方法不错 速度还可以Delphi自己带了的例子,不过我没仔细看:=)
我的方法是你在Image上面放一个PaintBox先画到PaintBox上去 如果继续修改图像,就把刚刚的那一笔画到Image上,如果Undo就不动Image 直接PaintBox刷新 所以这种方法需要纪录上次操作的内容,系统消耗比较少,不过只能Undo一步 如果多步的话Nose的方法不错 速度还可以Delphi自己带了的例子,不过我没仔细看:=)
A artx Unregistered / Unconfirmed GUEST, unregistred user! 2000-05-11 #8 若在图上只是画简单直线、圆等,就用异或操作(如cheka所说); 若是在图上进行复杂的修改,就用提取保留的图像的方法。
C cat.yy Unregistered / Unconfirmed GUEST, unregistred user! 2000-08-03 #10 重新画一次线就可以了 ” 这样你可以 UNDO 很多次(递推往前)。 如果你要提取中间结果 ----- 要麻烦一点 ----- 你要开一个窗口 你先要查询你要删除哪次画图操作,再确定是否要删(我正在编类似的 程序,不然就有现成的原代码贴给你了); 而且,你可能要记录下每 次操作的顺序,这个信息可以写到前面开辟的“格式字符串”中
重新画一次线就可以了 ” 这样你可以 UNDO 很多次(递推往前)。 如果你要提取中间结果 ----- 要麻烦一点 ----- 你要开一个窗口 你先要查询你要删除哪次画图操作,再确定是否要删(我正在编类似的 程序,不然就有现成的原代码贴给你了); 而且,你可能要记录下每 次操作的顺序,这个信息可以写到前面开辟的“格式字符串”中
C cat.yy Unregistered / Unconfirmed GUEST, unregistred user! 2000-08-03 #11 我少贴了前半段: 你可以设计一种格式字符串,把操作中用到的数据依次存到里面, 用数组 或memo?.lines[?]存储 -- 备用 在你想删除上一次操作时, 先取出上一次操作的数据,按 CHEKA 的方法: “ 设置光栅模式为异或 Canvas.Pen.Mode:=pmNotXor; 重新画一次线就可以了 ”
我少贴了前半段: 你可以设计一种格式字符串,把操作中用到的数据依次存到里面, 用数组 或memo?.lines[?]存储 -- 备用 在你想删除上一次操作时, 先取出上一次操作的数据,按 CHEKA 的方法: “ 设置光栅模式为异或 Canvas.Pen.Mode:=pmNotXor; 重新画一次线就可以了 ”