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, 不然背景不会跟着改变