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

时间:2011-04-30 10:56:30

标签: windows winapi mfc

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

3 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:10)

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

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

答案 2 :(得分:8)

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

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