大虾们,请教一个关于Canvas的问题。(附源码)(200分)

大愚

Unregistered / Unconfirmed
GUEST, unregistred user!
我想做一个让一副图像在窗体上移动的效果,开始用了Image控件,但快速移动时画面闪烁得很
厉害,后换用Canvas,闪烁虽然没了,但我不知怎么去除窗体上的残像(窗体本身也有图像),
我试过Repaint,但闪烁得更厉害了,请各位大虾给小弟开个“药方”。源码如下:
var
i:integer;
b:tbitmap;
//------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Interval:=40;
i:=form1.Width;
b:=tbitmap.Create;
b.LoadFromFile('C:/WINNT/lanma256.bmp');
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
canvas.Draw(i,50,b);
dec(i,3);
end;
 
学习
用控件picshow实现你这个效果不知道你觉得行不行?
 
// 去除窗体上的残像
用 Canvas.FillRect

大概的代码如下:

Form1.Canvas.Brush.Color := Form1.Color;
Form1.Canvas.Brush.Style := bsClear;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
canvas.Draw(i,50,b);
if i < ClientWidth - b.Width then // 开始出现残像
begin
// 擦除图片右边的 宽为 3 象素的矩形
Canvas.FillRect(Point(b.Left + b.Width, b.Top,
b.Left + b.Width + 3, b.Top + b.Height));
end;
dec(i,3);
end;

随手写的,可能需要调整,你自己试一试吧,反正大概思路(我的)就是这样。

 
to mdc:
我不想用现成的控件。再说这也达不到我的要求。
to beta:
谢谢你的解答,但我说了“窗体本身也有图像”,只是我没有在上面的源码上表现出来,如下:
这样做会把我作为背景的图也清除了。
var
i:integer;
b,e:tbitmap;
//------------------------
procedure TForm1.FormCreate(Sender: TObject);
begin
timer1.Interval:=40;
i:=form1.Width;
b:=tbitmap.Create;
e:=tbitmap.Create;
e.LoadFromFile('C:/WINNT/CIBAB.bmp');
b.LoadFromFile('C:/WINNT/lanma256.bmp');
Form1.Canvas.Brush.Color := Form1.Color;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
canvas.Draw(0,0,e);
canvas.Draw(i,50,b);
end;


procedure TForm1.Timer1Timer(Sender: TObject);
begin
canvas.Draw(i,50,b);
if i < ClientWidth - b.Width then // 开始出现残像
begin
// 擦除图片右边的 宽为 3 象素的矩形

Canvas.FillRect(rect(i + b.Width, 50,
i + b.Width + 3, 50 + b.Height));
end;
dec(i,3);
end;

是不是只能将背景图先整幅保存下来,再一片一片贴上去?
 
要不闪很容易, 只要在form.create时加一句doublebuffered := true就不闪了。 不过这样对“快速移动”有影响, 可能快速不起来,或者有跳动的感觉(而不是移动), 主要取决于你form的大小和你想移动的图片的大小。
另外你画图代码最好写在屏幕刷新的事件(onpaint)里(而不要随心所欲直接就在canvas上画),这样肯定不会出现你说的情况了。
 
嗯,如你所说,我试了一下,在timer1.Interval设得比较大时,效果还可以,但timer1.Interval设
得比较小时,或移动距离增大,画面就有晃动。
不知有没有更好的方法实现图像的“快速平滑移动”。
 
没有其它的方法了吗?[?]
Flash或PowerPoint是如何做到的呢?[?]
若实在没有我就只好结帖了。[:(]
 
绘制动态图像时 和 Form 中的已有内容进行 XOR

或 画前先保存该区域的图像,要擦除时画保存的图像
 
多人接受答案了。
 
顶部