DoubleBuffered Paint DrawImage使更新无效同步与异步的最终解释

本文关键字:异步 解释 同步 DrawImage Paint 更新 无效 DoubleBuffered | 更新日期: 2023-09-27 18:23:56

对我来说,使用Visual Studio创建应用程序的一个主要问题是文档。类或方法的描述是乏味的,以至于Visual Studio中显示的工具提示与MSDN中的文档一样具有信息性。MSDN中的例子从根本不存在到杂乱无章、夸大其词。

我所要求的是有人提供一个明确的解释(用一个非常干净和记录良好的例子),说明与管理表单上图形元素的显示和移动有关的所有事情的关系/激发顺序。目标是在表单上移动动画图像。

应回答的问题包括:(但不限于)

  1. 在单个缓冲表单上,DrawImage()方法何时绘制
  2. 在双缓冲窗体上,DrawImage()方法何时绘制
  3. 在双缓冲窗体上,是什么触发了要显示的未显示缓冲区
  4. 绘制到一个缓冲区的图像是否也自动绘制到第二个缓冲区?

  5. 是否需要为每个绘制事件重新绘制屏幕上的所有图像?

  6. 如何重新绘制Form.BackgroundImage?

  7. Form.Invalidate()触发的事件顺序是什么?

  8. Form.Invalidate(矩形)触发的事件顺序是什么
  9. Form.Update()触发的事件顺序是什么
  10. Form.Refresh()触发的事件顺序是什么?

  11. DrawImage()和Form.Invalidate()之间的关系是什么?

  12. DrawImage()和Form.Update()之间的关系是什么
  13. DrawImage()和Form.Refresh()之间的关系是什么?

  14. DrawImage()是否可以触发窗体Paint Event?

  15. from Paint事件能否安全地调用DrawImage()?

  16. 与处理Paint Event的多个线程相关的陷阱有哪些?

  17. 多个线程调用Form.Invalidate()有哪些陷阱
  18. 多个线程调用Form.Update()有哪些陷阱
  19. 多个线程调用Form.Refresh()有哪些陷阱
  20. 多个线程调用DrawImage()有哪些陷阱?

  21. 系统是否可以触发Form Paint事件,对动画会产生什么影响?

  22. 基本上,.Net的这一方面是如何运作的,"最佳实践"是什么?

请不要引用其他类、技术或方法。我希望能在这里构建一个明确的答案,这样之后的任何人都不需要进一步搜索来理解并立即变得富有成效。

谢谢!

DoubleBuffered Paint DrawImage使更新无效同步与异步的最终解释

当你需要这种细节时,你必须考虑使用像Telerik这样的反编译器来查看相关类(在这种情况下是Graphics类)的源代码。

关于16到20:多个线程无法访问一个Form,只有创建Form的线程才能在其上执行方法,您必须使用InvokeRequired和Invoke将请求从另一个线程移动到创建Form的螺纹。请参阅此处