在canvas画一根线或做一个动作后,有没有办法取消上次的操作? ( 积分: 50 )

  • 主题发起人 主题发起人 kimlon
  • 开始时间 开始时间
K

kimlon

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在是把所有数据先保存,要取消时再恢复,但这样影响速度。
 
我现在是把所有数据先保存,要取消时再恢复,但这样影响速度。
 
用XOR重画一次
 
但是要保存动作才行哦
 
不行呀,不能用XOR再画一次呀。因为比如我画一条直线,但底部还是有图案的呀。XOR之后只是变色了。而不是以前的图案
 
用XOR再画一次,刚好恢复以前的图案
 
Canvas.Pen.Mode:=pmXOR;
 
我想应该是在内存中重绘图像,再 BitBlt 吧。
 
保存直线所在的矩形。
至于 Xor,真是胡扯,你想画一条花线么。
 
上面的方法好
 
Canvas.Pen.Mode:=pmNOTXOR;
 
用xor重画一次
 
当然不能用xor~!
你这样:
内存中建一个MainSurface和一个BackSurface,每次在“画”的动作之前先将MainSurface的内容CopyRect()(或者BitBlt())到BackSurface上去,然后往MainSurface上画你要画的东西。
这样你如果需要撤销上一次画的操作,就只要把BackSurface上的内容再CopyRect()/Bitblt()回MainSurface上就行了。
当然,如果你需要做类似无限次Undo的话,那你得把每一种能执行“画”操作的东西都封装成类,然后每次“画”就是创建特定类的一个实例,并保存在一个链表里面。这样就可以实现无限次Undo了
你所说的“影响速度”我不太明白,应为常规就是这么做的,我当时用ddraw写类似画板程序的时候没出现“低效”的情况。。。
 
var
Form1: TForm1;
x1,y1:array [0..100] of integer;
i:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
image1.Picture.LoadFromFile('d:/1.bmp');
i:=0;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
j:integer;
begin
If ssleft in shift then
begin
x1:=x;
y1:=y;
i:=i+1;
if i=1 then
begin
image1.Canvas.MoveTo(x,y);
end
else
begin
image1.Canvas.LineTo(x,y);
end;
end;
If ssright in shift then
begin
image1.Picture.LoadFromFile('d:/1.bmp');
if i=0 then
begin
image1.Canvas.MoveTo(x,y);
end
else
begin
i:=i-1;
image1.Canvas.MoveTo(x1[0],y1[0]);
for j:=0 to i-1 do
begin
image1.Canvas.LineTo(x1[j],y1[j]);
end;
end;
end;
end;

随手写的,可以实现在image上左键画线,右键撤销。
数组用来记录坐标,据说用tlist比较好
 
其实你的方法已经很好了
Bcbj :Array[0..3] of TBitMap;//保存背景
就行了
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部