我正在用C#编写一个屏幕保护程序,慢慢绘制Sierpinski三角形。我在递归函数中使用Thread.Sleep
来减慢绘图速度。但是我需要一种允许用户通过移动鼠标,按键等退出的方法。当我从窗体的Paint
事件处理程序内部调用绘图函数时,鼠标和键盘事件仅在处理后绘制整个三角形,这可能需要一段时间。在递归函数运行时,如何强制表单处理事件? (以及如何避免因调用绘制函数而导致的无限循环,该事件调用绘制函数,强制事件处理调用绘制事件等。)
答案 0 :(得分:4)
你可以使用Application.DoEvents
- 但我不确定我会建议它。您可以轻松地解决重新入侵问题,尤其是在Paint
事件中。
如果您正在处理Paint
事件,听起来真的需要在UI线程上完成所有真正的工作 - 是吗?
另一种方法是创建一个Bitmap
并绘制到它上面,而不是使用Paint
事件处理程序。您可以在后台线程上执行此操作,定期创建新图像,将到目前为止绘制的图像复制到其上,绘制下一层(或其他),然后编组到UI线程以使用UI中的图像。这将保持主UI线程可用于事件处理。您根本不需要处理Paint
事件 - 只需使用PictureBox
来显示“到目前为止的图像”。当你完成它们时,不要忘记丢弃旧的位图,以避免内存问题。
答案 1 :(得分:2)
你可以使用你想要计算/绘制的后备缓冲区位图,只需在Paint
事件中显示它。计算可以在一个单独的线程中完成。