当前位置:编程学习 > C#/ASP.NET >>

C#画图双缓存解决闪烁的问题

在c#画图过程中,如果是直接在窗体上画图,那么增加以下代码很好的解决了问题

构造函数中
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.UserPaint, true);
this.SetStyle(ControlStyles.ResizeRedraw, true);  

在OnPaint函数中
BufferedGraphicsContext currentContext = BufferedGraphicsManager.Current;
BufferedGraphics myBuffer = currentContext.Allocate(e.Graphics, e.ClipRectangle);
Graphics g = myBuffer.Graphics;
...(中间过程省略)
myBuffer.Render(e.Graphics);

但是如果再窗体上增加一个Panel1控件,要在panel1上面画图,这时候以上代码就不管用了,画面会很闪

控件好像又不能设置SetStyle属性,高手看看怎么解决 --------------------编程问答-------------------- 自己在内存中建一个bitmap,在上面画,画好后,将bitmap设置为窗体的背景图,这样还避免了不停的触发onpaint绘图事件,当然你还可以采用脏矩形的算法去提高效率 --------------------编程问答--------------------
引用 1 楼 bdmh 的回复:
自己在内存中建一个bitmap,在上面画,画好后,将bitmap设置为窗体的背景图,这样还避免了不停的触发onpaint绘图事件,当然你还可以采用脏矩形的算法去提高效率


版主的意思是不要把代码写在OnPaint里面 --------------------编程问答-------------------- 完全可以不写在OnPaint中 --------------------编程问答--------------------
引用 3 楼 bdmh 的回复:
完全可以不写在OnPaint中


恩,我试了一下,的确是解决了刷新问题
但是我昨天提的问题又出现了,对于画好的图形,鼠标放上去之后,会有一条背景色的横线,导致画好的图形上面会有缺口 --------------------编程问答-------------------- Panel 有单独 绘图句柄,你设置Form的双缓冲对Panel没有效果,因为Panel没有开启双缓冲。简单的扩展一个PanelEx类,把下面的加到构造函数中即可
this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.DoubleBuffer, true); --------------------编程问答--------------------
引用 4 楼 ralph83 的回复:
引用 3 楼 bdmh 的回复:完全可以不写在OnPaint中

恩,我试了一下,的确是解决了刷新问题
但是我昨天提的问题又出现了,对于画好的图形,鼠标放上去之后,会有一条背景色的横线,导致画好的图形上面会有缺口

你可以适时的重绘bitmap,另外如果只是处理画线,可以用ControlPaint.DrawReversibleLine异步画线 --------------------编程问答--------------------
引用 6 楼 bdmh 的回复:
引用 4 楼 ralph83 的回复:引用 3 楼 bdmh 的回复:完全可以不写在OnPaint中

恩,我试了一下,的确是解决了刷新问题
但是我昨天提的问题又出现了,对于画好的图形,鼠标放上去之后,会有一条背景色的横线,导致画好的图形上面会有缺口
你可以适时的重绘bitmap,另外如果只是处理画线,可以用ControlPaint.DrawReversibleL……


我现在是这样的,一个panel里面,鼠标移上去之后,在panel里面显示一个跟随的十字线,当我鼠标停下来不懂时,横线就会没掉,竖线在的,目前就是这个问题未解决 --------------------编程问答-------------------- 发觉鼠标移动后很短的时间内出出现横线的情况,定义了一个timer,在鼠标移动后的300毫秒重新生成一次bitmap,目前只是出现横线的轻微抖动,不过感觉挺别扭
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,