【问题标题】:How Windows (or other OSes) update client's background area?Windows(或其他操作系统)如何更新客户端的后台区域?
【发布时间】:2009-05-24 08:22:53
【问题描述】:

或者换个方式问,OnEraseBkgnd() 是如何工作的?

我正在构建一个自定义控件,但遇到了这个问题。

像往常一样,子对象是矩形。我必须禁用 OnEraseBkgnd() 并且我只使用 OnPaint()。
我需要的是有效地清除孩子背后的区域,并且不会闪烁。
使用 后台缓冲区 之类的技术不是一种选择。

编辑:我对 OnEraseBkgnd() 的底层算法非常感兴趣。但也将接受任何有用的答案。

【问题讨论】:

  • 出于好奇,为什么双缓冲不是一种选择?
  • (1) 我使用普通窗口,(2) 也有可能在手持设备中使用它。

标签: windows algorithm drawing custom-component


【解决方案1】:

通常在 Windows 中,减少闪烁的最简单(但不是最有效)的方法是关闭 WM_ERASEBKGND 通知处理。这是因为如果您在通知处理程序中擦除背景,然后在WM_PAINT 处理程序中绘制窗口,两者之间会有短暂的延迟 - 这种延迟被视为闪烁。

相反,如果您在WM_PAINT 处理程序中执行所有擦除和绘图操作,您会看到更少的闪烁。这是因为减少了两者之间的延迟。您仍然会看到一些闪烁,尤其是在调整大小时,因为这两个操作之间仍有一小段延迟,并且您不能总是在下一次出现监视器垂直消隐中断之前获得所有绘图。如果您不能使用双缓冲,那么这可能是您能够使用的最有效的方法。

您可以通过遵循大多数关于客户区失效的常见建议来获得更好的绘图性能 - 除非您确实需要,否则不要使整个窗口失效。尝试仅使已更改的区域无效。此外,如果您同时更新一组子窗口的位置,则应使用BeginDeferWindowPos 函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-21
    • 2013-10-11
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 2022-06-15
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多