2

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

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

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

使用后台缓冲区之类的技术不是一种选择。

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

4

1 回答 1

3

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

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

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

于 2009-05-24T08:33:23.657 回答