W wangmax Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-05 #1 由于工作需要需在Canvas中作图,但在移动对象时需要重新绘制全屏所有对象, 此时对象会闪烁不断,怎样才能实现不闪烁,我还未找到很好的方法,所以请 教各位大侠帮帮忙,小弟在此多谢了。
卷 卷起千堆雪tyn Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-05 #2 加上 : procedure TForm1.FormCreate(Sender: TObject); begin DoubleBuffered :=True; end;
V V_Lucky Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-05 #3 要得到需要进行重绘的区域进行重绘 这样才能既高效又没有闪烁
W wangmax Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #5 v_Luck: 设置了DoubleBuffered :=True仍然还是闪烁。 卷起千堆雪tyn: 区域重绘在重绘部分也要闪烁。 天真: 我有好多对象都是位图重绘,不能用异或。 各位大侠:有没有更好的方法。
v_Luck: 设置了DoubleBuffered :=True仍然还是闪烁。 卷起千堆雪tyn: 区域重绘在重绘部分也要闪烁。 天真: 我有好多对象都是位图重绘,不能用异或。 各位大侠:有没有更好的方法。
卷 卷起千堆雪tyn Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #6 处理消息 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;
处理消息 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;
W wangmax Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #10 绘制对象的方法为: 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全部用白色覆盖,再重新绘制所有对象的。 多谢指教!
绘制对象的方法为: 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全部用白色覆盖,再重新绘制所有对象的。 多谢指教!
L lxddd Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #11 建立一个TBitmap对象,每次在此对象的Canvas中绘图,绘完后一次性Draw到 要显示的Canvas中去
W westbird Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #12 哈,我也遇到过类似问题。最后解决了: 1.确定你的Canvas控件的父控件,即如果你的Canvas控件是Image1,它在Panel1上,他的 父控件为Panel1,如果在Scrollbox1上,他的父控件为Scrollbox1; 2.设置 父控件.doublebuffered:=true; goodluck!
哈,我也遇到过类似问题。最后解决了: 1.确定你的Canvas控件的父控件,即如果你的Canvas控件是Image1,它在Panel1上,他的 父控件为Panel1,如果在Scrollbox1上,他的父控件为Scrollbox1; 2.设置 父控件.doublebuffered:=true; goodluck!
W wangmax Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #13 lxddd: 由于对象太多,所以速度慢,一次性draw的方法不适合。
W wangmax Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #14 westbird: Canvas的父控件就是主窗体,我设置MainForm.doublebuffered:=true;仍然无用。
卷 卷起千堆雪tyn Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #15 <在移动对象时需要重新绘制全屏所有对象, 此时对象会闪烁不断> 好像修改了问题么。 是不是想实现拷贝移动的效果?
老 老赵 Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-06 #17 老帖有讨论。 记得好像是只要将该控件放到panel上就行了。 >> Canvas的父控件就是主窗体,我设置MainForm.doublebuffered:=true;仍然无用。 panel-->client.不就行了? 多放一个panel怕啥?
老帖有讨论。 记得好像是只要将该控件放到panel上就行了。 >> Canvas的父控件就是主窗体,我设置MainForm.doublebuffered:=true;仍然无用。 panel-->client.不就行了? 多放一个panel怕啥?
R raiboi Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-07 #19 设置 Panel1.DoubleBuffered := True 看看?
马 马晓光 Unregistered / Unconfirmed GUEST, unregistred user! 2002-03-08 #20 将Image的AutoSize设为True,用Image的Canvas试试看。