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

Delphi 在双缓冲TTreeView上自定义绘图时闪烁,delphi,delphi-7,doublebuffered,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

以这种方式侦听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;
。。。似乎当我启用双缓冲时,控件决定不将“额外内容”复制到屏幕外缓冲区。这意味着,只要我不打扰正在讨论的窗口,一切都很好。当我这样做时,“额外的东西”只在窗口的随机部分可见


我在这里遗漏了什么?

既然你的评论让我全权提出一个替代解决方案,我会这样做:

  • 停止使用双缓冲。它会导致许多控件中出现许多视觉上的奇怪现象。我个人像躲避瘟疫一样躲避它
  • 通过将
    WS_EX_COMPOSITED
    扩展窗口样式添加到控件中来解决闪烁问题。这种窗口样式可能有点拖累性能,我建议您只在调整大小循环期间添加它,这是您需要的时候。我在这里的回答中描述了如何做到这一点:

  • 既然你的评论让我全权提出另一种解决方案,我会这样做:

  • 停止使用双缓冲。它会导致许多控件中出现许多视觉上的奇怪现象。我个人像躲避瘟疫一样躲避它
  • 通过将
    WS_EX_COMPOSITED
    扩展窗口样式添加到控件中来解决闪烁问题。这种窗口样式可能有点拖累性能,我建议您只在调整大小循环期间添加它,这是您需要的时候。我在这里的回答中描述了如何做到这一点:

  • 听起来简单的解决方案是将
    双缓冲
    切换到
    。为什么你不能这样做?@DavidHeffernan好吧,这使得在调整控件大小时可以看到擦除。这就是我试图阻止的。这很容易做到。只需在调整大小循环中添加扩展窗口样式
    WS_EX_COMPOSITED
    。就我个人而言,我制作了无闪烁的Delphi应用程序,在调整大小时无闪烁,没有双缓冲区,我认为这是一个邪恶的属性。更多细节请参见我的回答:它可以工作,使用通常的CreateParams覆盖!听起来简单的解决方案是将
    双缓冲
    切换到
    。为什么你不能这样做?@DavidHeffernan好吧,这使得在调整控件大小时可以看到擦除。这就是我试图阻止的。这很容易做到。只需在调整大小循环中添加扩展窗口样式
    WS_EX_COMPOSITED
    。就我个人而言,我制作了无闪烁的Delphi应用程序,在调整大小时无闪烁,没有双缓冲区,我认为这是一个邪恶的属性。更多细节请参见我的回答:它可以工作,使用通常的CreateParams覆盖!