【问题标题】:Difference between GetDC() and BeginPaint()GetDC() 和 BeginPaint() 的区别
【发布时间】:2011-08-16 00:37:13
【问题描述】:

我正在开发 Win32 用户界面。我想知道 GetDC 和 BeginPaint 之间的区别。何时使用哪个 API,何时不使用哪个 API。

【问题讨论】:

    标签: windows winapi mfc


    【解决方案1】:

    BeginPaint 仅用于响应WM_PAINT 消息。它获取的设备上下文指向窗口的无效(待重绘)区域。然后应该使用EndPaint 发布它。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的宝贵意见。如果我在 WM_PAINT 中使用 GetDC 而不是 BeginPaint 会出现任何问题
      • 阅读 Hans Passant 的回复,详细了解为什么这不是一个好主意。当您创建一个新的 Visual Studio 项目时,您会在 WM_PAINT 处理程序中获得 BeginPaint 和 EndPaint,为什么要使用 GetDC?
      【解决方案3】:

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

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

      【讨论】:

      • 谢谢,这解释了我在没有 EndPaint 的情况下获得的 CPU 利用率。
      • 是的。 EndPaint 本质上调用 ValidateRect。您可以遵从 DefWindowProc(验证 rect),也可以自己调用 ValidateRect。
      猜你喜欢
      • 2016-07-02
      • 2012-08-22
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 2019-01-11
      相关资源
      最近更新 更多