9

可以使用 GetDC/ReleaseDC 在窗口的客户区进行绘制。但是为了响应 WM_PAINT 消息,必须使用 BeginPaint/EndPaint。这有什么特别之处吗?

4

3 回答 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 回答