调整大小时防止 TPaintBox 闪烁
Prevent TPaintBox flicker when resizing
我有一个 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);
}
但是,这意味着没有重绘任何内容,包括框架的标题栏及其所有控件。
我知道这是一个很常见的问题,有解决办法吗?
在 Remy Lebeau 的旧 post 中找到了答案,参见 http://www.delphigroups.info/2/81/414040.html
There are several different ways to intercept messages on a
per-control. Deriving a new class is only one of them. You could also
subclass just the WindowProc property of an existing object instance.
For example:
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;
我有一个 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);
}
但是,这意味着没有重绘任何内容,包括框架的标题栏及其所有控件。
我知道这是一个很常见的问题,有解决办法吗?
在 Remy Lebeau 的旧 post 中找到了答案,参见 http://www.delphigroups.info/2/81/414040.html
There are several different ways to intercept messages on a per-control. Deriving a new class is only one of them. You could also subclass just the WindowProc property of an existing object instance. For example:
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;