ValidateRect和BeginPaint的区别

5

根据MSDN文档:

BeginPaint函数会验证整个客户端区域。

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

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

有人能告诉我在BeginPaint/EndPaint配对后是否需要调用ValidateRect吗? 我在MSDN上没有看到任何说明,我看到的文档和示例都表明不需要调用ValidateRect


2
非常不清楚。只有在直接绘制窗口而不需要WM_PAINT时,您才应该调用ValidateRect。在动画中并不罕见。 - Hans Passant
1个回答

3
不是必要的。当您在WM_PAINT中处理(绘制)区域时,使用BeginPaint来验证该区域。

ValidateRect更多地用于“取消无效”,通常在直接在窗口上绘制而没有WM_PAINT或因为某些更改而不再想要发出待处理的WM_PAINT之后。

它修复了一个错误的事实可能意味着还有其他问题,并且这个错误被意外地修复了(也许通过减少WM_PAINT消息的数量?),或者是错误的观察(例如,您更改了2件事情,但这件事情引起了注意,而不是实际修复的另一件事情)。


这恰好是我告诉那位提出这个问题的程序员的,但我们正在调试的代码段非常复杂,很难真正确定。不幸的是,使用调试器进行任何有意义的操作往往会干扰与绘画相关的代码 :( - Armentage

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接