请问GDI+的双缓冲到底如何实现,有没有代码给我参考下???

解决方案 »

  1.   

    使用,      
    SetStyle(System.Windows.Forms.ControlStyles.OptimizedDoubleBuffer, true);
    SetStyle(System.Windows.Forms.ControlStyles.DoubleBuffer, true);
      

  2.   

    激活双缓冲:
    方法一:
    this.SetStyle(ControlStyles.OptimizedDoubleBuffer,true);
    this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
    (OptimizedDoubleBuffer替换了之前版本的DoubleBuffer,除非为了兼容性,应该避免使用DoubleBuffer)
    方法二:
    在窗体设计器中将窗体的DoubleBuffered属性设为true。(默认为false)。
    这是由Control基类实现的,所以应该将所有自定义控件和用户控件的DoubleBuffered属性设置为true:
    base.DoubleBuffered=true;
      

  3.   


     class Clock
        {
            Graphics g;
            Control p;
            Image backGround;
            Image secHand;
            Image minHand;
            Image houHand;
            Thread thr;
            public Clock()
            {            SetSkin();
                thr = new Thread(new ThreadStart(Draw));
            }
            void SetSkin()
            {
                backGround = Skin.clock_Bg;// Resource1.BackGround; //Image.FromFile(Setting.Clock.ClockBackGround);
                secHand = Skin.clock_SHand;//Resource1.SecoundHand; //Image.FromFile(Setting.Clock.SecoundHand );
                minHand = Skin.clock_MHand; //Resource1.MinutHand; //Image.FromFile(Setting.Clock.MinuteHand );
                houHand = Skin.clock_HHand;//Resource1.HourHand;// Image.FromFile(Setting.Clock.HourHand);
            }
            public Graphics SetGraphic
            {
                set
                {
                    g = value;
                }
            }
            public Control SetPanel
            {
                set
                {
                    p = value;
                    p.Width = backGround.Width;
                    p.Height  = backGround.Height;
                }
            }
            public void ModifySkin()
            {
                backGround = Skin.clock_Bg;// Resource1.BackGround; //Image.FromFile(Setting.Clock.ClockBackGround);
                secHand = Skin.clock_SHand;//Resource1.SecoundHand; //Image.FromFile(Setting.Clock.SecoundHand );
                minHand = Skin.clock_MHand; //Resource1.MinutHand; //Image.FromFile(Setting.Clock.MinuteHand );
                houHand = Skin.clock_HHand;//Resource1.HourHand;// Image.FromFile(Setting.Clock.HourHand);
            }
            public void Dispose()
            {
                thr.Abort ();
            }
            public void BeginDraw()
            {
                thr.Start();
            }
            void Draw()
            {
                if (p != null && g != null)
                {
                    int totalTime = 0;
                    int secCount = DateTime.Now.Second ;
                    int minCount = DateTime.Now.Minute ;
                    int hourCount = ((DateTime.Now.Hour));
                    do
                    {                    int timeSpan =1000;          
                        SetSkin();
                        Point center = new Point(p.Width / 2, p.Height / 2);
                        Graphics buffer ;
                        //背景
                        Bitmap backGroundBit = new Bitmap(p.Width, p.Height);
                        buffer = Graphics.FromImage(backGroundBit);
                        buffer.Clear(Setting.Clock.MakeTransparentColor);
                        buffer.DrawImage(backGround, new Rectangle(center.X - backGround.Width / 2, center.Y - backGround.Height / 2, backGround.Width, backGround.Height), new Rectangle(0, 0, backGround.Width, backGround.Height), GraphicsUnit.Pixel);
                        buffer.Dispose();
                        
                
                        
                        //时针
                        buffer = Graphics.FromImage(backGroundBit);
                        buffer.TranslateTransform(center.X, center.Y);
                        buffer.RotateTransform((float)hourCount * 360f / 12f +180 );
                        buffer.TranslateTransform(0, -10);
                        buffer.DrawImage(houHand, 0 ,0);
                        buffer.Dispose();
                        //分针
                        buffer = Graphics.FromImage(backGroundBit);
                        buffer.TranslateTransform(center.X, center.Y);
                        buffer.RotateTransform((float)minCount * 6+186  );
                        buffer.TranslateTransform(0, -10);
                        buffer.DrawImage(minHand, 0,0 );
                        buffer.Dispose();
                        //秒针
                        buffer = Graphics.FromImage(backGroundBit);
                        buffer.TranslateTransform(center.X, center.Y);
                        buffer.RotateTransform(((float)secCount) * 6 +186 );
                        buffer.TranslateTransform(0, -10);
                        buffer.DrawImage(secHand, 0, 0 );                   
                        buffer.Dispose();
                                         
                        
                        //输出时间
        
                        Font font = new Font("Arial", 12, FontStyle.Bold);
                        SizeF size = g.MeasureString(DateTime.Now.ToLongTimeString(), font);
                        Bitmap wordsBit = new Bitmap((int)size.Width+1, (int)size.Height+1);
                        buffer = Graphics.FromImage(wordsBit);                  
                        SolidBrush brush;
                        brush = new SolidBrush(Color.White);
                        buffer.DrawString(DateTime.Now.ToLongTimeString(), font, brush, new PointF(1, 1));
                        //buffer.TranslateTransform(center.X, center.Y);
                        buffer.Dispose();                  
                        brush = new SolidBrush(Color.Black );
                        int r =p.Width/2 ;
                        Bitmap numBit = new Bitmap(r*2, r*2);
                        buffer = Graphics.FromImage(numBit);
                        buffer.TranslateTransform(r ,r);
                        for (int i = 0; i < 12; i++)
                        {
                            PointF pp = new PointF(-buffer.MeasureString((i + 1).ToString(), font).Width / 2, -r);
                            buffer.RotateTransform(30);
                            buffer.DrawString((i+1).ToString(), font, brush,pp );
                        }
                        buffer.Dispose ();
                      
                        //合成
                        g.DrawImage(backGroundBit, new Point(0, 0));
                        g.DrawImage(wordsBit, new PointF(center.X - size.Width / 2, center.Y + 12));
                        g.DrawImage(numBit, new Point(0, 0));                    wordsBit.Dispose();
                        backGroundBit.Dispose();
                      
                        totalTime++;                    secCount = DateTime.Now.Second;
                        minCount = DateTime.Now.Minute;
                        hourCount = ((DateTime.Now.Hour));                    thr.Join(timeSpan);                         }
                    while (true);
                }            
            }
        }
    Draw里面就是双缓冲。看看吧。。写的一个时钟
    写的烂。。见笑了。。