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绘图事件,当然你还可以采用脏矩形的算法去提高效率 --------------------编程问答--------------------
版主的意思是不要把代码写在OnPaint里面 --------------------编程问答-------------------- 完全可以不写在OnPaint中 --------------------编程问答--------------------
恩,我试了一下,的确是解决了刷新问题
但是我昨天提的问题又出现了,对于画好的图形,鼠标放上去之后,会有一条背景色的横线,导致画好的图形上面会有缺口 --------------------编程问答-------------------- Panel 有单独 绘图句柄,你设置Form的双缓冲对Panel没有效果,因为Panel没有开启双缓冲。简单的扩展一个PanelEx类,把下面的加到构造函数中即可
this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.DoubleBuffer, true); --------------------编程问答--------------------
你可以适时的重绘bitmap,另外如果只是处理画线,可以用ControlPaint.DrawReversibleLine异步画线 --------------------编程问答--------------------
我现在是这样的,一个panel里面,鼠标移上去之后,在panel里面显示一个跟随的十字线,当我鼠标停下来不懂时,横线就会没掉,竖线在的,目前就是这个问题未解决 --------------------编程问答-------------------- 发觉鼠标移动后很短的时间内出出现横线的情况,定义了一个timer,在鼠标移动后的300毫秒重新生成一次bitmap,目前只是出现横线的轻微抖动,不过感觉挺别扭
补充:.NET技术 , C#