日期:2014-05-17  浏览次数:20897 次

C#Winform 双缓冲不知道如何下手,虚心求教~!


C# 求救:窗体上有N多按钮,当更换按钮上图片时,闪屏,肿么办?双缓存不知道如何下手...

网上找了一些例子,有很多不能用:

private void Form1_Load(object sender, EventArgs e)//这里写这些 对不对呀?肿么感觉效果不明显啊
        {
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint |
                          ControlStyles.AllPaintingInWmPaint,
                          true);
            this.UpdateStyles();
        }


还有在 OnPaint下面写的代码:这样写后 那个按钮图片更新得更慢了

 protected override void OnPaint(PaintEventArgs e)
        {

            Rectangle rect = e.ClipRectangle;
            Bitmap bufferimage = new Bitmap(this.Width, this.Height);
            Graphics g = Graphics.FromImage(bufferimage);
            //这中间是不是少了什么东西?那个显示在显示器上的怎么让它先绘制到bufferimage里面啊?
            this.CreateGraphics().DrawImage(bufferimage, 0, 0);
        }
winform 双缓冲

------解决方案--------------------
双缓存代码不是放在form里,是放在你要绘制对象所在的类里,看你的代码,双缓存应该放在button类的构造函数里

public class 你的按钮类:Button
{
  public 你的按钮类()
  {
   InitializeComponent();
 this.SetStyle(ControlStyles.OptimizedDoubleBuffer 
------解决方案--------------------
 ControlStyles.UserPaint 
------解决方案--------------------

                          ControlStyles.AllPaintingInWmPaint,
                          true);
            this.UpdateStyles();
  }
}


------解决方案--------------------
OnPaint中绘制大图像会慢的,你可以在内存中先绘制I个bitmap,然后将这个bitmap作为控件的背景图

            Bitmap bmp = new Bitmap(100, 100);
            Graphics g = Graphics.FromImage(bmp);
            g.DrawString("sssss", this.Font, Brushes.Red,10,10);
            this.BackgroundImage = bmp;