我一直在试验设备上下文,并从MSDN文档中阅读了很多有关它的内容。 我创建了一个程序,该程序使用双缓冲进行绘画,但遇到一个小问题(这不是一个真正的问题,但从我的角度来说很好奇)。
根据MSDN,在窗口上进行绘制时,应使用BeginPaint和EndPaint;在其他任何地方执行绘制时,应使用releaseDC和getDC。
我决定无论如何都尝试使用GetDC和ReleaseDC,并且设法使其正常工作。唯一的问题是程序生命周期内的CPU使用率非常高。我说的是25%到50%的CPU使用率。
我将发布WM_PAINT中的代码。 感谢您了解为什么会发生这种情况的任何提示。
paintWindow是我自己的函数,它创建屏幕外的DC,渲染帧并将内容复制到hdc。该代码并不重要,因为我100%肯定,与我遇到的问题无关。
以下代码可完美运行。没有高CPU使用率。一切都很棒。
CASE WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
paintWindow(hdc);
EndPaint(hWnd, &ps);
一旦我尝试做这样的事情:
hdc = GetDC(hWnd);
paintWindow(hdc);
ReleaseDC(hWnd, hdc);
除了CPU使用率很高之外,该代码仍然可以像以前一样完美地工作。 这或多或少是一个优化问题,出于自身的好奇心,我想知道背景的确切差异是什么,如果我想实现与BeginPaint和EndPaind相同的功能,该怎么办。
答案 0 :(得分:3)
The WM_PAINT message由消息检索功能自动生成,只要窗口的一部分无效(通过显式调用InvalidateRect或调整窗口大小或取消显示窗口)。
需要您的WM_PAINT
处理程序来验证无效区域,从而告诉系统不再需要绘画。 BeginPaint调用会为您完成此操作。如果您无法验证无效区域,系统将继续生成WM_PAINT
消息。
如果您确实想保留基于GetDC
的方法(无论出于何种原因;我不知道一个),则必须在返回之前显式调用ValidateRect,这样系统就不会继续生成WM_PAINT
消息。