【问题标题】:ValidateRect vs BeginPaintValidateRect 与 BeginPaint
【发布时间】:2012-08-27 21:33:23
【问题描述】:

来自 MSDN 文档:

BeginPaint 函数验证整个客户区。

ValidateRect 函数的一部分不应被调用 必须在下一个 WM_PAINT 消息之前验证更新区域 生成。1

多年来我一直在使用 Win32 API 进行编程,但我从未想过要调用 ValidateRect 函数。今天我的一位同事指出,我们错过了对 ValidateRect 的调用,这修复了我们使用 GDI 制作高速动画时的一个错误(我知道,一个矛盾的说法)

有人可以告诉我在BeginPaint/EndPaint 对之后是否需要调用ValidateRect?我在 MSDN 上没有看到任何说明这一点的文档,而且我看到的哪些文档和示例表明不需要调用 ValidateRect

【问题讨论】:

  • 很不清楚。只有在直接绘制到窗口时才应该调用 ValidateRect,因此不需要 WM_PAINT。在动画中并不少见。

标签: winapi


【解决方案1】:

没必要。 BeginPaint 在验证区域时使用,因为您在 WM_PAINT 中处理(绘制)了它。

ValidateRect 更多的是“取消失效”,通常是在没有WM_PAINT 的情况下直接在窗口上绘画之后,或者因为某些事情发生了变化并且您不再希望收到待处理的WM_PAINT

它修复了一个错误这一事实可能意味着发生了其他事情,而这意外地修复了它(可能是通过减少 WM_PAINT 消息的数量?),或者错误的观察结果(例如,您更改了 2 件事但这个得到了关注,而不是其他的,这是实际的修复)。

【讨论】:

  • 这正是我告诉引起我注意的编码员的话,但是我们正在调试的代码段有些复杂,很难真正说出。不幸的是,在任何有意义的地方使用调试器往往会干扰绘制相关代码:(
猜你喜欢
  • 2012-08-22
  • 2011-08-16
  • 2019-01-11
  • 2015-11-13
  • 2016-07-02
  • 2010-10-13
  • 2015-03-06
  • 2010-09-11
  • 2015-10-10
相关资源
最近更新 更多