请问如何消除copy时的闪烁?(50分)

  • 主题发起人 主题发起人 doghead
  • 开始时间 开始时间
D

doghead

Unregistered / Unconfirmed
GUEST, unregistred user!
我在一个image的canvas上已画了一副图形
现在从内存位图上copy另画的一张图到image的canvas上,
但是有很明显的闪烁,如何消除?
谢谢
 
form.doublebuffered:=true;较为简单的做法
 
form.doublebuffered:=true试过了,还是不行
再说明一下,我用的是copyrect 和 bitblt 来copy的,
不知道是不是由于这两个函数重绘引起的。
 
闪烁基本上都是背景重画引起的
处理WM_ERASEBKGND消息,什么都不做直接返回
试试
 
pihome说得非常正确,我替他把代码写出来吧
....
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
....
procedure TFlickerFreePaintBox.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1;
end;

下面是Another_eyes大侠的解释:
来自:Another_eYes 时间:1999-6-5 21:40:21 ID:112470

容器闪烁的原因并不是光用双缓冲就能解决的, 因为容器是继承自TWinControl类的, 它的刷新
是windows控制的, 不是delphi, 刷新时, windows先发送WM_ERASEBKGND消息通知清除要
刷新区域的底色(因为你改变的是容器的背景, 所以这个区域就是整个client), 然后发
WM_PAINT消息通知重画, 引起闪烁的罪魁其实就是WM_ERASEBKGND, 所以只要你截掉
WM_ERASEBKGND消息, 什么都不做就返回就成了(千万别inherited原来的消息处理程序)



来自:Another_eYes 时间:1999-6-5 23:02:28 ID:112493

另外, 如果要实现TWinControl类的透明, 则需要用setwindowlong修改parent的style属
性,不然得到的背景不正确(要么是直接透明到form下面的桌面上去了, 要么得到一个灰色的rect,
取决于你是否截掉WM_ERASEBKGND),
在透明TWinControl控件移动时要调用ReCreateWnd, 不然背景不会跟着改变
 
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
procedure TFlickerFreePaintBox.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1;
end;

请问procedure WMEraseBkgnd是定义在tform 类里的还是另外定义的类
我是用image控件作图的,是不是需要重新定义一下这个控件
请解释一下TFlickerFreePaintBox.WMEraseBkgnd
(新手上路,麻烦见谅)

 
这里拦截消息...
建议看一看关于消息方面的资料

正确的写法

TFlickerFreePaintBox = class(TForm)
...
private
procedure WMEraseBkgnd(var Msg: TWMEraseBkgnd); message WM_ERASEBKGND;
public
...
end;

...

procedure TFlickerFreePaintBox.WMEraseBkgnd(var Msg: TWMEraseBkgnd);
begin
Message.Result := 1;
end;
 
WMEraseBkgnd是定义在TFlickerFreePaintBox类里的,要拦截那个对象的消息就定义在哪个对象里啦,实现的代码是一样的。
 
感谢各位的帮助,特别感谢小笨苯和pihome
基本上已经成功,只是还有一点,现在窗体编程透明的了...
 
多人接受答案了。
 
非常感谢你们二位!
 
闪烁解决了,但是现在窗体其他部分透明了,把原来窗体下面的背景直接填补上来了
Help..........................
 
后退
顶部