可以使用 GetDC/ReleaseDC 在窗口的客户区进行绘制。但是为了响应 WM_PAINT 消息,必须使用 BeginPaint/EndPaint。这有什么特别之处吗?
问问题
1840 次
3 回答
9
当需要更新窗口的一部分时会发出 WM_PAINT 消息。通过指定 BeginPaint/EndPaint() 你告诉 gdi 你实际上是在做那个工作。如果您不为指定区域调用 BeginPaint(),WM_PAINT 消息将一直生成,直到有人实际更新它为止。该功能为您提供 DC 只是因为它很方便。在内部 BeginPaint()/EndPaint() 可能调用 GetDC()/ReleaseDC()。
与 GetDC 和 ReleaseDC 相比,您告诉 GDI您现在要在 DC 上绘制一些东西,而 gdi 没有要求您必须这样做。
于 2011-08-13T18:29:20.673 回答
6
是的,当然。BeginPaint() 检索更新区域并自动处理再次清空它。如果您使用 GetDC(),那么您会注意到您的程序正在燃烧 100% cpu 内核,一遍又一遍地运行 WM_PAINT 处理程序,因为更新区域从未被清除过。您必须调用 ValidateRect() 来避免这种情况。
于 2011-08-13T18:27:53.730 回答
5
BeginPaint 函数自动设置设备上下文的剪辑区域,因此如果只需要重绘窗口的一部分,则不会重绘整个窗口。
于 2011-08-13T18:26:25.477 回答