我在表单上有一些自定义进度条,它们每秒更新/刷新两次,并且它们在闪烁。
TMyProgressBar = class(TCustomControl)
我从 继承了控件TCustomControl
,因为我需要Handle
一些TWinControl
事件。控件(最多 64 个项目)是动态创建的并放在 ScrollBox 上。当进度更新时,我首先调用InvalidateRect
.
所有的绘画工作(一组矩形,DrawText
等等 - 灵感来自这里)都在内存 DC 中执行,然后BitBlt
在控件的 DC 上进行编辑。无论如何它都在闪烁,似乎组件消失并重新出现。恕我直言,这是由背景擦除引起的。
在这个无闪烁的绘图建议中,它被写入以WM_ERASEBKGND
下列方式处理:
type
TMyProgressBar = class(TCustomControl)
procedure WMEraseBkGnd(var Message:TMessage); message WM_ERASEBKGND;
procedure TMyProgressBar.WMEraseBkGnd(var Message: TMessage);
begin
Message.Result := 1;
end;
但在另一个组件中,由 TMS ( TAdvProgressBar
)Result
设置0
为相同的消息。
现在Windows 文档指出:
如果清除背景,应用程序应该返回非零值;否则,它应该返回零。
我测试了两种变体(结果 = 0、1),令我惊讶的是,它们都避免了闪烁。
那么现在,我必须在我的 Delphi 代码中添加什么?正确的方法是什么?