【发布时间】:2011-08-16 00:37:13
【问题描述】:
我正在开发 Win32 用户界面。我想知道 GetDC 和 BeginPaint 之间的区别。何时使用哪个 API,何时不使用哪个 API。
【问题讨论】:
我正在开发 Win32 用户界面。我想知道 GetDC 和 BeginPaint 之间的区别。何时使用哪个 API,何时不使用哪个 API。
【问题讨论】:
BeginPaint 仅用于响应WM_PAINT 消息。它获取的设备上下文指向窗口的无效(待重绘)区域。然后应该使用EndPaint 发布它。
GetDC 可以随时调用。它获取的设备上下文指向窗口的整个客户区。要发布它,您应该致电ReleaseDC。
【讨论】:
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() 清除它。
【讨论】: