2011-06-30 40 views
2

在我的代码中,只调用.Invalidate和调用更新一样。事实上,当我打电话。事后更新,控制闪烁似乎更糟糕。我阅读文档页面上的以下内容:无效后需要.NET Control.Update方法吗?

“Update方法只是强制立即涂上控制”

这是混淆了我作为重绘告诉我指定一个无效区域的所有网上的例子,然后调用更新以获得最少量的闪烁。基于这些例子,我会假定更新调用是强制性的。

回答

3

本博客文章介绍了差异between Control.Invalidate and Control.Update

Control.Invalidate(...)

的布尔参数表示 用户是否要在无效子控制的 控制他是 调用Invalidate。矩形 参数是无效的边界 ,区域参数是区域 无效。所有过载 基本上最终都会调用RedrawWindow,InvaliateRect或 InvalidateRgn函数中的一个 。如果 RedrawWindow被调用,那么这可能导致在 的WM_PAINT消息被 发布到应用程序消息 队列中(以使子控件 无效)。

这里要注意的重要一点是 ,这些功能仅通过增加 它控制的 窗口的当前更新区域“无效” 或“脏”的客户区。这个 无效区域,连同所有 更新区域中的其他区域,当012ff接收到WM_PAINT消息时, 被标记为绘画。作为 结果,您可能无法立即看到您的控制 刷新(并显示 失效)(或同步显示 )。

Control.Update()

更新函数调用UpdateWindow 功能,通过发送WM_PAINT消息 到窗口(控制的) 如果窗口的更新区域更新控制的客户区 不是 空。此函数将WM_PAINT 直接发送到绕过 应用程序消息队列的WNDPROC()。因此,如果 窗口更新区域先前是 “无效”,则调用“更新” 将立即“更新”(并导致 重绘)无效。

Control.Refresh()

现在,你可能已经猜到了什么 刷新()会做。是的,它 调用无效(true)使无效 该控件及其子,然后 调用Update()强制绘制 控件,使无效是 同步。

+0

谢谢。我搜索了20分钟左右,找不到像这样的明确解释。我错过了关键字'差异'。 – Phil

相关问题