绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示。
刷新过程中会导致所有图元重新绘制,而各个图元的重绘操作并不会导致Paint事件发生,因此窗口的每一次刷新只会调用Paint事件一次。
窗口刷新一次的过程中,每一个图元的重绘都会 立即显示到窗口,因此整个窗口中,只要是图元所在的位置,都在刷新,而刷新的时间是有差别的,闪烁现象自然会出现。
所以说,此时导致窗口闪烁现象的关键因素并不在于Paint事件调用的次数多少,而在于各个图元的重绘。
根据以上分析可知,
当图元数目不多时,窗口刷新的位置也不多,窗口闪烁效果并不严重;
当图元数目较多时,绘图窗口进行重绘的图元数量增加,绘图窗口每一次 刷新都会导致较多的图元重新绘制,窗口的较多位置都在刷新,闪烁现象自然就会越来越严重。
特别是图元比较大绘制时间比较长时,闪烁问题会更加严重,因为时 间延迟会更长。
双缓存实现的原理:
先在内存中开辟一个与原先画布一样大小的画布,将所有内容绘制到新开辟的画布中;绘制完毕后,将绘制好的Bitmap一次性绘制到原先的画布背景上
由于这个过程中只向画布上绘制了一次,所以闪屏的问题得以缓解
public void Print(Canvas ca, float x, float y) { GraphicsState GraphicsState = ca.Graphics.Save(); Bitmap bufferimage = new Bitmap(Width, Height); Graphics gBmp = Graphics.FromImage(bufferimage); OnDraw(gBmp); ca.Graphics.DrawImage(bufferimage, x, y, Width, Height); ca.Graphics.Restore(GraphicsState); }