delphi - 在双缓冲 TTreeView 上自定义绘图时闪烁

标签 delphi delphi-7 doublebuffered

当这样监听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 ,一切都很好。当我这样做时,“额外的东西”仅在窗口的随机部分可见。

我在这里缺少什么?

最佳答案

由于您的评论让我全权建议替代解决方案,因此我会这样做:

  1. 停止使用DoubleBuffered。它导致许多控件出现许多视觉上的奇怪现象。我个人像躲避瘟疫一样躲避它。
  2. 通过向控件添加 WS_EX_COMPOSITED 扩展窗口样式来解决闪烁问题。这种窗口样式可能会有点拖累性能,我建议您仅在调整大小循环期间(即您需要它的时候)添加它。我在此处的回答中描述了如何做到这一点:TLabel and TGroupbox Captions Flicker on Resize .

关于delphi - 在双缓冲 TTreeView 上自定义绘图时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14651099/

相关文章:

delphi - VirtualTreeview:何时对子项进行排序?

delphi - 无法使用 SendInput(Edit1.Text) 复制俄语(西里尔字母或 Unicode)符号

c - 在内置汇编程序例程中使用 EBX 寄存器

java - 我做的不正确或理解 Android 上的双缓冲吗?

C# 双缓冲?

delphi - 如何将 "nil"常量传递给无类型参数?

delphi - 扩展delphi TEditCopy操作以将列表框项目也复制到剪贴板

c++ - 在双缓冲区多线程系统中执行指针交换

mysql - 如何在 Delphi 7 中连接 FastReport 和 MySQL 5.5?

ssl - 通过 IdHTTP 和 IdSSLIOHandlerSocketOpenSSL1 读取并保存部分文件流