Предотвращение мерцания 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;
Другие вопросы по тегам