windows - Windows(或其他操作系统)如何更新客户端的后台区域?

标签 windows algorithm drawing custom-component

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

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

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

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

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

最佳答案

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

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

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

关于windows - Windows(或其他操作系统)如何更新客户端的后台区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/903327/

相关文章:

r - 大小为 K 的整数分区

ios - 平滑手绘的自由形状

c# - 编程竞赛题目: Counting Polyominos

windows - 我可以有条件地为 Windows 子系统编译我的 Rust 程序吗?

windows - 为什么Windows在新的x64进程中使用RCX、RDX作为指针,与新创建的32位进程中的EAX、EBX不同?

windows - 哪种代码签名可以对驱动程序 (.sys) 进行签名?

algorithm - 关于平衡树分析

ios - 绘制轮廓的opencv线大小

java - 在 Java 中绘制屏幕

c++ - 如何在未安装 Visual Studio 的计算机上查看给定线程中正在运行哪个 DLL?