GetDC()和BeginPaint()之间的区别

13

我正在开发Win32 UI。 我想知道GetDC和BeginPaint之间的区别。使用哪个API以及何时不使用哪个API。

3个回答

18

GetDC仅返回设备上下文的句柄,可以随时在任何地方用于自己的绘图。而BeginPaint则准备窗口进行绘制,并提供有关应绘制什么(如背景是否需要重新绘制以及需要绘制的矩形)的信息。

各自应该何时使用?BeginPaint最常见于WM_PAINT处理程序中(MSDN:应用程序不应主动调用BeginPaint函数,除非响应WM_PAINT消息。每次调用BeginPaint必须有相应的EndPaint函数调用)。GetDC可以在任何地方使用,因此如果要在外部窗口上绘制,则可以使用GetDC。基本上是在非WM_PAINT处理程序中的任何时间都可以使用GetDC。BeginPaint和EndPaint还会对插入符号产生一些影响。请阅读msdn以获取更多详细信息。


感谢宝贵的意见。如果我在WM_PAINT中使用GetDC而不是BeginPaint,会有任何问题吗? - Umesha MS
1
阅读Hans Passant的回复,了解为什么这不是一个好主意。当您创建一个新的Visual Studio项目时,您已经在WM_PAINT处理程序中获得了BeginPaint和EndPaint,为什么要使用GetDC呢? - Matt

13

GetDC() 不能 替代 Begin+EndPaint()。如果您尝试,您会发现您的UI线程开始烧100% CPU核心,并且您的 WM_PAINT处理程序一遍又一遍地被调用。

重点是BeginPaint(),它清除窗口的更新区域。PAINTSTRUCT.rcPaint的值。只要窗口有脏矩形,由窗口管理器创建或显式调用InvalidateRect()的程序调用,WM_PAINT就会生成。BeginPaint()将其清除。


1
谢谢,这解释了我在没有EndPaint的情况下得到的CPU利用率。 - Helge Klein
1
True。EndPaint本质上调用ValidateRect。您可以选择推迟到DefWindowProc(它会验证矩形),或者自己调用ValidateRect。 - Dwayne Robinson

12

BeginPaint 应该只在响应 WM_PAINT 消息时调用。它获取的设备上下文指向窗口需要重新绘制的无效区域。使用 EndPaint 释放。

GetDC 可以在任何时间调用。它获取的设备上下文指向窗口的整个客户区域。使用 ReleaseDC 进行释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接