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

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

GetDC只是将句柄返回到设备上下文,可以随时随地使用它来完成自己的绘图。 另一方面,BeginPaint为绘画准备了窗口,并提供了有关应绘画的信息(例如背景是否需要重绘以及需要绘制的矩形)。

什么时候使用每个例子? BeginPaint在WM_PAINT处理程序中最为常见(MSDN:除了响应WM_PAINT消息,应用程序不应该调用BeginPaint,每次调用BeginPaint都必须对EndPaint函数进行相应的调用)。 GetDC可以在任何地方使用,所以如果你想在外部窗口上绘图。 基本上任何时候都不在WM_PAINT处理程序中。 BeginPaint和EndPaint对插入符号也有一些影响。 阅读msdn了解更多细节。

BeginPaint仅用于响应WM_PAINT消息而被调用。 它获得的设备上下文指向窗口的无效(要重绘)区域。 它应该然后释放使用EndPaint

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

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

最大的是EndPaint(),它清除窗口的更新区域。 PAINTSTRUCT.rcPaint的值。 只要窗口有一个脏矩形,就会生成WM_PAINT,由窗口管理器或程序明确调用InvalidateRect()调用创建。 EndPaint()清除它。