当这样监听TTreeView事件的AdvancedCustomDraw事件时:
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 时,控件决定不将“额外的内容”复制到屏幕外缓冲区。这意味着只要我不打扰有问题的 window ,一切都很好。当我这样做时,“额外的东西”仅在窗口的随机部分可见。
我在这里缺少什么?
最佳答案
由于您的评论让我全权建议替代解决方案,因此我会这样做:
- 停止使用
DoubleBuffered
。它导致许多控件出现许多视觉上的奇怪现象。我个人像躲避瘟疫一样躲避它。 - 通过向控件添加
WS_EX_COMPOSITED
扩展窗口样式来解决闪烁问题。这种窗口样式可能会有点拖累性能,我建议您仅在调整大小循环期间(即您需要它的时候)添加它。我在此处的回答中描述了如何做到这一点:TLabel and TGroupbox Captions Flicker on Resize .
关于delphi - 在双缓冲 TTreeView 上自定义绘图时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651099/