我正在研究 Win32 UI。我想知道 GetDC 和 BeginPaint 之间的区别。何时使用哪个 API,何时不使用哪个 API。
GetDC 只是返回设备上下文的句柄,您可以随时随地使用它来进行自己的绘图。另一方面,BeginPaint 准备用于绘制的窗口,并且还提供应绘制内容的信息(例如背景是否需要重新绘制以及需要绘制的矩形)。
何时使用每种的示例? BeginPaint 最常见于 WM_PAINT 处理程序中(MSDN:应用程序不应调用 BeginPaint,除非响应 WM_PAINT 消息。对 BeginPaint 的每次调用都必须有对 EndPaint 函数的相应调用。)。 GetDC 可以在任何地方使用,所以如果你想在外部窗口上绘图。基本上任何时候不在 WM_PAINT 处理程序中。 BeginPaint 和 EndPaint 也对插入符号有一些影响。阅读 msdn 了解更多详细信息。
GetDC() 不是 替代Begin+EndPaint()。如果你尝试,你会发现你的 UI 线程开始消耗 100% 的 cpu 核心,并且你的 WM_PAINT 处理程序被一遍又一遍地调用。
最重要的是BeginPaint(),它清除窗口的更新区域。 PAINTSTRUCT.rcPaint 的值。只要窗口有脏矩形,WM_PAINT 就会生成,该脏矩形是由窗口管理器或程序显式调用它的 InvalidateRect() 调用创建的。 BeginPaint() 清除它。
BeginPaint
旨在仅在响应 WM_PAINT
消息时被调用。它获得的设备上下文指向窗口的无效(要重绘)区域。然后应该使用 EndPaint
将其释放。
GetDC
随时可以拨打。它获得的设备上下文指向窗口的整个客户区。要释放它,您应该拨打ReleaseDC
。
如果我们在wm_paint之外使用hdc,我们使用get_dc/relese_dc,如果我们在wm_paint内部使用hdc,我们使用begin_paint/end_paint。