在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属性,高手看看怎么解决

解决方案 »

  1.   

    自己在内存中建一个bitmap,在上面画,画好后,将bitmap设置为窗体的背景图,这样还避免了不停的触发onpaint绘图事件,当然你还可以采用脏矩形的算法去提高效率
      

  2.   


    版主的意思是不要把代码写在OnPaint里面
      

  3.   

    Panel 有单独 绘图句柄,你设置Form的双缓冲对Panel没有效果,因为Panel没有开启双缓冲。简单的扩展一个PanelEx类,把下面的加到构造函数中即可
    this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.DoubleBuffer, true);
      

  4.   

    你可以适时的重绘bitmap,另外如果只是处理画线,可以用ControlPaint.DrawReversibleLine异步画线
      

  5.   


    我现在是这样的,一个panel里面,鼠标移上去之后,在panel里面显示一个跟随的十字线,当我鼠标停下来不懂时,横线就会没掉,竖线在的,目前就是这个问题未解决
      

  6.   

    发觉鼠标移动后很短的时间内出出现横线的情况,定义了一个timer,在鼠标移动后的300毫秒重新生成一次bitmap,目前只是出现横线的轻微抖动,不过感觉挺别扭