怎样实现在Canvas中画图不闪烁?(200分)

  • 主题发起人 主题发起人 wangmax
  • 开始时间 开始时间
W

wangmax

Unregistered / Unconfirmed
GUEST, unregistred user!
由于工作需要需在Canvas中作图,但在移动对象时需要重新绘制全屏所有对象,
此时对象会闪烁不断,怎样才能实现不闪烁,我还未找到很好的方法,所以请
教各位大侠帮帮忙,小弟在此多谢了。
 
加上 :

procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered :=True;
end;
 
要得到需要进行重绘的区域进行重绘

这样才能既高效又没有闪烁
 
对移动的时候,用异或!就不会有闪烁!
 
v_Luck: 设置了DoubleBuffered :=True仍然还是闪烁。
卷起千堆雪tyn: 区域重绘在重绘部分也要闪烁。
天真: 我有好多对象都是位图重绘,不能用异或。
各位大侠:有没有更好的方法。
 
处理消息 WM_ERASEBKGND,试试。

private
{ Private declarations }
procedure WMERASEBKGND(var M :TWMERASEBKGND);message WM_ERASEBKGND;

procedure TForm1.WMERASEBKGND(var M :TWMERASEBKGND);
begin
M.Result :=LRESULT(False);
end;
 
卷起千堆雪tyn: 还是不行。
 
能否把相关的程序贴出来?
这样猜不是办法。
 
绘制对象的方法为:
procedure TObject.Draw;
begin
//..
bitblt(myCanvas.Handle,myRect.TopLeft.X ,myRect.TopLeft.Y ,
myObjWidth,myObjHeight,TempBitmap.Canvas.Handle ,0,0,SRCCOPY);
//...
end;
注:tempBitmap取imagelist中的图;
在对象移动时,将canvas全部用白色覆盖,再重新绘制所有对象的。

多谢指教!
 
建立一个TBitmap对象,每次在此对象的Canvas中绘图,绘完后一次性Draw到
要显示的Canvas中去
 
哈,我也遇到过类似问题。最后解决了:
1.确定你的Canvas控件的父控件,即如果你的Canvas控件是Image1,它在Panel1上,他的
父控件为Panel1,如果在Scrollbox1上,他的父控件为Scrollbox1;
2.设置 父控件.doublebuffered:=true;

goodluck!
 
lxddd:
由于对象太多,所以速度慢,一次性draw的方法不适合。
 
westbird:
Canvas的父控件就是主窗体,我设置MainForm.doublebuffered:=true;仍然无用。
 
<在移动对象时需要重新绘制全屏所有对象,
此时对象会闪烁不断>
好像修改了问题么。
是不是想实现拷贝移动的效果?
 
老帖有讨论。
记得好像是只要将该控件放到panel上就行了。

>> Canvas的父控件就是主窗体,我设置MainForm.doublebuffered:=true;仍然无用。
panel-->client.不就行了?
多放一个panel怕啥?
 
同意楼上
 
设置 Panel1.DoubleBuffered := True 看看?
 
将Image的AutoSize设为True,用Image的Canvas试试看。
 
后退
顶部