在处理 WM_PAINT 消息时,我省略了 BeginPaint 和 EndPaint 调用,CPU 使用率飙升至 100%。为什么是这样?
我也在使用工作线程......但他们做了一些不同的事情,似乎对这个问题没有影响。
另外,我可以使用 GetDC() 中的设备上下文而不是 BeginPaint 吗?他们似乎有不同的价值观,所以我认为他们有不同的工作。
抱歉,如果我听起来像个白痴——我是 WinAPI、C++ 和一般逻辑世界的新手……
谢谢
这是完全正常的。当窗口的更新区域不为空时,Windows 会生成 WM_PAINT 消息。您应该做的是再次将其标记为空。例如,您可以通过调用 Begin/EndPaint() 来执行此操作。
如果您不这样做,那么 Windows 会立即生成另一条 WM_PAINT 消息,仍在尝试清空更新区域。您的线程将消耗 100% 的核心,闲置处理 WM_PAINT 消息,并没有真正完成工作。也许你真的在画画,Windows 只是不知道你画了什么,也不会去猜测它。
使用 Begin/EndPaint() 是完成这项工作的明智方法。这不是唯一的方法,您还可以调用 ValidateRect() 或 ValidateRgn()。只要您是“winapi 新手”,我强烈建议您以正常方式执行此操作。
不确定是否是这种情况,但 beginpaint 和 endpaint 也会验证窗口的绘制区域,如果你不使用它们,那么 windows 不知道你已经重绘了这个区域。你可以调用 ValidateRect 函数来通知窗口被重绘的事实.
不确定这对您的情况是否有帮助,您可以在下面阅读更多关于 tjis 的信息
GDI 发出 WM_PAINT 消息来更新窗口的一部分。BeginPaint/EndPaint()
通知 gdi 处理程序正在执行该工作。在指定区域没有 BeginPaint() 的情况下,在窗口被更新(由某人)之前,将生成 WM_PAINT 消息。这就是您需要BeginPaint/EndPaint()
在 WM_PAINT 处理程序中的原因,并且在没有它的情况下您会看到 CPU 使用率很高。
GetDC() 不是 Begin+EndPaint() 的替代品,因为我在上一段中提到了原因。