处理wm_paint消息时,我省略了beginpaint和endPaint呼叫,而CPU使用率最高为100%。为什么这是?
我也在使用工人线程...但是它们做了不同的事情,似乎对此事没有影响。
另外,我可以使用getDC()而不是开始paint的设备上下文吗?他们似乎有不同的价值观,所以我认为他们的工作不同。
对不起,如果我听起来像个白痴 - 我是Winapi,C 的新手,而只是逻辑的整个世界...
谢谢
这完全正常。Windows在"不空"中的窗口更新区域时会生成WM_PAINT消息。您所谓的要做的就是再次将其标记为空。例如,您这样做,通过调用begin/endpaint()。
如果您不这样做,则Windows 立即生成了另一个WM_PAINT消息,仍然试图使更新区域清空。您的线程将燃烧100%的核心,闲置处理WM_PAINT消息,而实际上无法完成工作。也许您实际上是在绘画,Windows只是不知道您绘制了什么,也不试图猜测它。
使用begin/endPaint()是完成该工作的理智方法。这不是唯一的方法,您也可以调用有效Paterect()或有效PatergeNgn()。只要您是" Winapi的新手",我强烈建议您以正常方式这样做。
不确定是否是这种情况,但是beginpaint和endPaint也验证了窗口的绘制区域,如果您不使用它们,那么Windows不知道您已经重新划定了此区域。有效的派系功能以告知窗口被重新绘制的事实。
不确定在您的情况下这是否有帮助,您可以在以下情况下阅读更多有关tjis的信息
getDC()和beginpaint()
gdi发出WM_PAINT消息以更新窗口的一部分。BeginPaint/EndPaint()
通知GDI,处理程序正在从事这项工作。在没有针对指定区域的beginpaint()的情况下,直到将生成窗口(由某人)WM_PAINT消息更新为止。这就是您在WM_PAINT处理程序中需要BeginPaint/EndPaint()
的原因,而在没有看到高CPU利用率的情况下。
getDc()不能替代Begin EndPaint(),因为我上一段中提到的原因。