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

问题描述 投票:0回答:4

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

windows winapi mfc
4个回答
18
投票

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

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


14
投票

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

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


12
投票

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

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


0
投票

如果我们在wm_paint之外使用hdc,我们使用get_dc/relese_dc,如果我们在wm_paint内部使用hdc,我们使用begin_paint/end_paint。

© www.soinside.com 2019 - 2024. All rights reserved.