Предотвращение мерцания TPaintBox при изменении размера
У меня есть (стилизованный)
TFrame
с некоторыми элементами управления и
TPanel
который является контейнером для
TPaintBox
где рисую видео. Когда я изменяю размер кадра, изображение на ящике для рисования мерцает из-за печально известного стирания фона. Я часами гуглил и все перепробовал (установка рамки для рисования
ControlStyle
к
csOpaque
, панель настроек
Brush
к
bsClear
, изменение панели на двойную буферизацию, настройка панели
FullRepaint
на ложь), но единственное, что помогает, - это перехватить
WM_ERASEBKGND
сообщение моего кадра:
void __fastcall TFrameSample::WndProc(TMessage &Message)
{
if (Message.Msg == WM_ERASEBKGND)
Message.Result = 1;
else
TFrame::WndProc(Message);
}
Однако это означает, что ничего не перерисовывается, включая строку заголовка фрейма и все его элементы управления. Я знаю, что это очень распространенная проблема, есть ли вообще решение?
1 ответ
Нашел ответ в старом сообщении Реми Лебо, см. 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;