Мерцание, когда пользовательский рисунок на двойном буфере TTreeView

При прослушивании события AdvancedCustomDraw события TTreeView следующим образом:

if Stage = cdPrePaint then begin
    // modify some Sender.Canvas properties and let it draw itself
end else if Stage = cdPostPaint then begin
    // draw 'something extra' using a separate TControlCanvas
    TControlCanvas.TextOut(SomeRect, 'Hello');
end;

... кажется, что, когда я включаю DoubleBuffered, элемент управления решает не копировать "что-то дополнительное" в буфер за пределами экрана. Это означает, что пока я не нарушаю рассматриваемое окно, все в порядке. Когда я это делаю, "что-то лишнее" видно только в случайных частях окна.

Что мне здесь не хватает?

1 ответ

Решение

Так как ваш комментарий дал мне карт-бланш, чтобы предложить альтернативное решение, вот что я хотел бы сделать:

  1. Прекратить использование DoubleBuffered, Это приводит к множеству визуальных странностей во многих элементах управления. Я лично избегаю этого как чума.
  2. Решите проблему мерцания, добавив WS_EX_COMPOSITED расширенный стиль окна для вашего контроля. Этот стиль окна может немного снизить производительность, и я бы рекомендовал добавлять его только во время цикла изменения размера, когда он вам нужен. Я опишу, как это сделать, в своем ответе здесь: TLabel и TGroupbox Captions Flicker при изменении размера.
Другие вопросы по тегам