可以使用GetDC / ReleaseDC在窗口的客户区域中绘制。但是响应WM_PAINT消息,必须使用BeginPaint / EndPaint。这有什么特别之处吗?
答案 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因此,如果只需要重绘部分窗口,则不会重绘整个窗口。