或者换个方式问,OnEraseBkgnd() 是如何工作的?
我正在构建一个自定义控件,并且遇到了这个问题。
像往常一样,子项是矩形。我必须禁用 OnEraseBkgnd() 并且只使用OnPaint()。
我需要的是有效地清除 child 后面的区域并且不闪烁。
使用后台缓冲区等技术不是一种选择。
编辑:我对 OnEraseBkgnd() 背后的算法非常感兴趣。但任何有帮助的答案也将被接受。
最佳答案
通常在 Windows 中,减少闪烁最简单(但不是最有效)的方法是关闭 WM_ERASEBKGND
通知处理。这是因为,如果您在通知处理程序中删除背景,然后在 WM_PAINT
处理程序中绘制窗口,则两者之间会有短暂的延迟 - 此延迟被视为闪烁。
相反,如果您在 WM_PAINT
处理程序中执行所有删除和绘制操作,您会看到更少的闪烁。这是因为两者之间的延迟减少了。您仍然会看到一些闪烁,特别是在调整大小时,因为两个操作之间仍然存在很小的延迟,并且您无法始终在显示器下一次出现垂直消隐中断之前进入所有绘图。如果您无法使用双缓冲,那么这可能是您能够使用的最有效的方法。
通过遵循有关客户区失效的大多数常见建议,您可以获得更好的绘图性能 - 除非确实需要,否则不要使整个窗口失效。尝试仅使已更改的区域无效。另外,如果您要同时更新子窗口集合的位置,则应该使用 BeginDeferWindowPos
函数。
关于windows - Windows(或其他操作系统)如何更新客户端的后台区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903327/