Windows GetDC()和BeginPaint()之间的差异

Windows GetDC()和BeginPaint()之间的差异,windows,winapi,mfc,Windows,Winapi,Mfc,我正在处理Win32 UI。我想知道GetDC和BeginPaint之间的区别。何时使用哪种API以及何时不使用哪种API。BeginPaint仅在响应WM_PAINT消息时调用。它获得的设备上下文指向窗口的无效(要重新绘制)区域。然后应使用EndPaint将其释放 GetDC可以随时调用。它获得的设备上下文指向窗口的整个客户端区域。要释放它,您应该调用ReleaseDCGetDC将句柄简单地返回到设备上下文,该句柄可以在任何时间、任何地点用于绘制自己的图形。另一方面,BeginPaint为绘制

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

BeginPaint
仅在响应
WM_PAINT
消息时调用。它获得的设备上下文指向窗口的无效(要重新绘制)区域。然后应使用
EndPaint
将其释放


GetDC
可以随时调用。它获得的设备上下文指向窗口的整个客户端区域。要释放它,您应该调用
ReleaseDC

GetDC将句柄简单地返回到设备上下文,该句柄可以在任何时间、任何地点用于绘制自己的图形。另一方面,BeginPaint为绘制窗口做好准备,还提供了关于应该绘制什么的信息(例如背景是否需要重新绘制以及需要绘制的矩形)

何时使用每种方法的示例?BeginPaint最常见于WM_PAINT处理程序中(MSDN:应用程序不应调用BeginPaint,除非响应WM_PAINT消息。对BeginPaint的每次调用都必须具有对EndPaint函数的相应调用)。GetDC可以在任何地方使用,因此如果您想在外部窗口上绘图。基本上,任何时候都不在WM_油漆处理程序中。BeginPaint和EndPaint也会对插入符号产生一些影响。有关详细信息,请阅读msdn。

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


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

感谢您的宝贵输入。如果我在WM_PAINT中使用GetDC而不是BeginPaint,它会带来任何问题阅读Hans Passant的回复,了解为什么这不是一个好主意的详细信息。创建新的visual studio项目时,WM_PAINT处理程序中已经有了BeginPaint和EndPaint,为什么要使用GetDC?谢谢,这解释了我在没有EndPaint.True的情况下获得的CPU利用率。EndPaint本质上调用了Validate。您可以遵从DefWindowProc(它验证rect),也可以自己调用ValidateProc。