【问题标题】:Flicker when custom drawing on a double buffered TTreeView在双缓冲 TTreeView 上自定义绘图时闪烁
【发布时间】:2013-01-17 01:10:13
【问题描述】:

以这种方式监听 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 时,控件决定不将“额外的东西”复制到屏幕外缓冲区。这意味着只要我不打扰有问题的窗户,一切都很好。当我这样做时,“额外的东西”仅在窗口的随机部分可见。

我在这里错过了什么?

【问题讨论】:

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

标签: delphi delphi-7 doublebuffered


【解决方案1】:

由于您的评论让我全权推荐替代解决方案,这就是我要做的:

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

【讨论】:

    猜你喜欢
    • 2015-05-01
    • 1970-01-01
    • 2014-10-12
    • 2010-10-05
    • 2016-04-04
    • 2014-08-13
    • 2019-06-12
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多