Windows(或其他操作系统)如何更新客户端的背景区域?

时间:2009-05-24 08:22:54

标签: windows algorithm drawing custom-component

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

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

孩子们像往常一样是长方形。我必须禁用 OnEraseBkgnd()并且我只使用OnPaint()。我需要的是有效地清除孩子背后的区域而不会闪烁。

使用后缓冲器等技术不是一种选择。

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

1 个答案:

答案 0 :(得分:3)

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

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

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