Мерцание, когда пользовательский рисунок на двойном буфере 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 ответ
Решение
Так как ваш комментарий дал мне карт-бланш, чтобы предложить альтернативное решение, вот что я хотел бы сделать:
- Прекратить использование
DoubleBuffered
, Это приводит к множеству визуальных странностей во многих элементах управления. Я лично избегаю этого как чума. - Решите проблему мерцания, добавив
WS_EX_COMPOSITED
расширенный стиль окна для вашего контроля. Этот стиль окна может немного снизить производительность, и я бы рекомендовал добавлять его только во время цикла изменения размера, когда он вам нужен. Я опишу, как это сделать, в своем ответе здесь: TLabel и TGroupbox Captions Flicker при изменении размера.