Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 防止TPaintBox在调整大小时闪烁_Delphi_C++builder_C++builder 10.4 Sydney - Fatal编程技术网

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中删除对这一点的引用。我一直在想,是否可以只截取油漆盒或其祖先面板的背景擦除?另一个想法是从面板继承并创建一个新的面板,该面板禁用了背景擦除功能?不确定这是否有意义。您可以在运行时基于每个控件对public
WindowProc
属性进行子类化。或者,您可以派生一个新类,并在编译时重写虚拟的
WndProc()
方法。哦,刚刚发布了答案,现在可以看到您的评论了。如果你想发布答案,我会删除我的。谢谢