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

Vad*_*dim 9 c++ winapi gdi paint wm-paint

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

Tob*_*gel 9

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

与GetDC和ReleaseDC相比,您告诉GDI 现在要在DC上绘制一些东西,而gdi请求您必须这样做.

  • 这个答案缺少一个重要方面:[BeginPaint](https://msdn.microsoft.com/en-us/library/dd183362.aspx)"设置设备上下文的剪切区域以排除更新区域之外的任何区域. " (正如[elevener的答案]中指出的那样(http://stackoverflow.com/a/7052434/1889329)). (2认同)

ele*_*ner 5

BeginPaint 函数会自动设置设备上下文的剪切区域,因此如果只需要重绘窗口的一部分,它就不会重绘整个窗口。


Han*_*ant 5

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

  • 实际上,`GetUpdateRgn`可以检索当前的更新区域,并且`ValidateRect`(或`ValidateRgn`)可用于验证rect/region.`BeginPaint`和`EndPaint`更容易. (2认同)