调整大小时防止 TPaintBox 闪烁

时间:2021-06-07 12:09:49

标签: delphi c++builder c++builder-10.4-sydney

我有一个带有一些控件的 TFrame 和一个 TPanel,它是我在其中绘制视频的 TPaintBox 的容器。

当我调整框架大小时,由于臭名昭著的背景擦除,油漆盒上的图像闪烁。

我用谷歌搜索了几个小时并尝试了所有方法(将 PaintBox 的 ControlStyle 设置为 csOpaque,将面板的 Brush 设置为 bsClear,将面板更改为双缓冲,设置面板的 FullRepaint 为 false 等),但唯一有效的方法是拦截我框架中的 WM_ERASEBKGND 消息:

void __fastcall TFrameSample::WndProc(TMessage &Message)
{
    if (Message.Msg == WM_ERASEBKGND)
        Message.Result = 1;
    else
        TFrame::WndProc(Message);
}

然而,这意味着没有重绘任何内容,包括框架的标题栏及其所有控件。

我知道这是一个很常见的问题,有解决办法吗?

1 个答案:

答案 0 :(得分:2)

在 Remy Lebeau 的旧帖子中找到答案,请参阅 http://www.delphigroups.info/2/81/414040.html

<块引用>

有几种不同的方法可以拦截一个 每个控件。派生一个新的类只是其中之一。你也可以 子类只是现有对象实例的 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;
相关问题