有没有什么特别的关于使用BeginPaint / EndPain而不是GetDC / ReleaseDC来响应WM_PAINT消息?

时间:2011-08-13 18:21:06

标签: c++ winapi gdi paint wm-paint

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

3 个答案:

答案 0 :(得分:9)

当需要更新窗口的一部分时,会发出WM_PAINT消息。 通过指定BeginPaint / EndPaint(),您告诉gdi您实际上在做这项工作。 如果没有为指定区域调用BeginPaint(),WM_PAINT消息将生成很长时间,直到有人实际更新它。该功能只为您提供DC,因为它很方便。内部BeginPaint()/ EndPaint()可能调用GetDC()/ ReleaseDC()。

与GetDC和ReleaseDC相比,你告诉GDI 现在要在DC上绘制一些内容,而gdi请求你必须这样做。

答案 1 :(得分:5)

是的,当然。 BeginPaint()检索更新区域并自动再次清空它。如果你使用GetDC()那么你会注意到你的程序烧掉了100%的cpu核心,一遍又一遍地运行WM_PAINT处理程序,因为更新区域从未被清除过。你必须调用ValidateRect()来避免这种情况。

答案 2 :(得分:4)

BeginPaint function automatically sets the clipping region of the device context因此,如果只需要重绘部分窗口,则不会重绘整个窗口。