我正在使用Win32 UI。我想知道GetDC和BeginPaint之间的区别。何时使用哪个API以及何时不使用哪个API。
答案 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
。