Delphi 防止TPaintBox在调整大小时闪烁
我有一个带有一些控件的Delphi 防止TPaintBox在调整大小时闪烁,delphi,c++builder,c++builder-10.4-sydney,Delphi,C++builder,C++builder 10.4 Sydney,我有一个带有一些控件的t框架,还有一个TPanel,它是一个TPaintBox的容器,我在这里画视频 当我调整帧的大小时,由于臭名昭著的背景擦除,颜料盒上的图像会闪烁 我在谷歌上搜索了几个小时,尝试了一切(将油漆盒的ControlStyle设置为csOpaque,将面板的笔刷设置为bsClear,将面板更改为双缓冲,将面板的fullrepait设置为false,等等)但唯一能起作用的是截取我的帧中的WM_ERASEBKGND消息: void\uu fastcall TFrameSample::W
t框架
,还有一个TPanel
,它是一个TPaintBox
的容器,我在这里画视频
当我调整帧的大小时,由于臭名昭著的背景擦除,颜料盒上的图像会闪烁
我在谷歌上搜索了几个小时,尝试了一切(将油漆盒的ControlStyle
设置为csOpaque
,将面板的笔刷设置为bsClear
,将面板更改为双缓冲,将面板的fullrepait
设置为false,等等)但唯一能起作用的是截取我的帧中的WM_ERASEBKGND
消息:
void\uu fastcall TFrameSample::WndProc(TMessage&Message)
{
如果(Message.Msg==WM_ERASEBKGND)
Message.Result=1;
其他的
TFrame::WndProc(消息);
}
但是,这意味着没有任何内容被重绘,包括框架的标题栏及其所有控件
我知道这是一个非常常见的问题,有解决办法吗?在Remy Lebeau的一篇旧文章中找到了答案,请参阅
有几种不同的方法可以截获网络上的消息
每个对照组。派生新类只是其中之一。你也可以
子类只是现有对象实例的WindowProc属性。
例如:
private
OldWndMethod: TWndMethod;
procedure PanelWndProc(var Message: TMessage);
constructor TForm1.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
OldWndMethod := Panel1.WindowProc
Panel1.WindowProc := PanelWndProc;
end;
procedure TForm1.PanelWndProc(var Message: TMessage);
begin
if Message.Msg = WM_ERASEBKGND then
begin
//...
end else
OldWndMethod(Message);
end;
如果你禁用样式,你会有同样的问题吗?好问题@RemyLebeau。我刚刚测试了这个,答案是肯定的。我将在我的Q.@RemyLebeau中删除对这一点的引用。我一直在想,是否可以只截取油漆盒或其祖先面板的背景擦除?另一个想法是从面板继承并创建一个新的面板,该面板禁用了背景擦除功能?不确定这是否有意义。您可以在运行时基于每个控件对publicWindowProc
属性进行子类化。或者,您可以派生一个新类,并在编译时重写虚拟的WndProc()
方法。哦,刚刚发布了答案,现在可以看到您的评论了。如果你想发布答案,我会删除我的。谢谢