private void timer1_Tick(object sender, EventArgs e)
        {
            g = tabControlPanel2.CreateGraphics();
            Pen P1 = new Pen(Color.Blue, 2);
            g.DrawEllipse(P1, 80, 30, 230, 230);
            g.DrawEllipse(new Pen(Color.Blue), 90, 40, 210, 210);
           
            Point point3 = new Point((230 / 2 + 80), (230 / 2 + 30));
            Point point4 = new Point(((int)(230 / 2 + 80 + 230 / 2 * System.Math.Sin(1.57 + j))), ((int)(230 / 2 + 30 - 230 / 2*System.Math.Cos(1.57 + j))));
            //point3.X = 230 / 2 + 80;
            //point3.Y = 230 / 2 + 30;
            //point4.X = (int)(230 / 2 + 80 + 230 / 2 * System.Math.Sin(1.57 + j));
            //point4.Y = (int)(230 / 2 + 30 - 230 / 2 * System.Math.Cos(1.57 + j));            g.DrawLine(new Pen(Color.Blue), point3, point4);
            j = j + 0.5;
        }       timer1.Interval = 50;
       请问为什么会不停的闪烁,太老火了,我不想让它闪烁,应该怎么办啊

解决方案 »

  1.   

    根本原因:
    直接用GDI+多次绘制到控件速度太慢。导致在CLEAR的时候速度无法到达视觉的刷新速度
    建议用双缓存……
    先在内存理新建一个Graphic然后在这个Graphic里面吧图片组合好 然后在把组合好的图片整体画在控件的Graphic上 这个样子可以有效减少闪烁
      

  2.   

    好像使用双缓存也不能完全解决问题,用Opengl,呵呵
      

  3.   

    那请问用OpenGL怎么画呢,能不能贴个代码,谢谢
      

  4.   

    双缓冲..
    如果还不行就双缓冲+DrawDib
      

  5.   

    另外timer的间隔应该改小点= =
      

  6.   

    搂主每50毫秒重绘一次,确实频率太高,使用双缓冲后,我估计会导致程序反应很迟钝!搂主如果想使用双缓冲,不如直接使用.NET内置的双缓冲功能:
    在你窗体的构造函数内添加下面代码,来开启双缓冲即可:
    //开启双缓冲
    base.SetStyle(ControlStyles.OptimizedDoubleBuffer |
            ControlStyles.AllPaintingInWmPaint |
            ControlStyles.UserPaint, true);
    base.SetStyle(ControlStyles.ResizeRedraw | ControlStyles.Selectable, true);建议搂主先添加这两句代码后,再看看效果如何
      

  7.   

    另外,给楼主完善下代码:
            private void timer1_Tick(object sender, EventArgs e) 
            { 
                g = tabControlPanel2.CreateGraphics(); 
                Pen P1 = new Pen(Color.Blue, 2); 
                g.DrawEllipse(P1, 80, 30, 230, 230); 
                p1.Width = 1;
                g.DrawEllipse(p1, 90, 40, 210, 210); 

              
                Point point3 = new Point((230 / 2 + 80), (230 / 2 + 30)); 
                Point point4 = new Point(((int)(230 / 2 + 80 + 230 / 2 * System.Math.Sin(1.57 + j))), ((int)(230 / 2 + 30 - 230 / 2*System.Math.Cos(1.57 + j)))); 
                //point3.X = 230 / 2 + 80; 
                //point3.Y = 230 / 2 + 30; 
                //point4.X = (int)(230 / 2 + 80 + 230 / 2 * System.Math.Sin(1.57 + j)); 
                //point4.Y = (int)(230 / 2 + 30 - 230 / 2 * System.Math.Cos(1.57 + j));             p1.Color = Color.Blue;
                g.DrawLine(p1, point3, point4); 

                j = j + 0.5; 
                p1.Dispose();
                g.Dispose();

            } 也就是说,能重用的对象,尽量重用;对象使用完后,能释放的尽量释放。
      

  8.   

    画简单的东西用不着opengl or directx 这种大炮,用gdi+ 也能做好比较好,至于闪烁 ,先把图一次性在 一个image 上画好,然后再输出到界面,非常有效地减少闪烁。
    曾经用这样的方法做坦克大战,刷新率达到了0.04秒,也不闪烁。
      

  9.   


    双缓冲我写过个例子9L ,还有别人的一些方法
    http://topic.csdn.net/u/20081029/21/1619cabb-61b4-4344-b776-4bdbb5d85936.html
      

  10.   

    编写过 C# Windows GDI+ 绘图程序的人都知道,当在窗体中绘制了一个图形后,如果拖动该图形,系统重新绘制时,屏幕会一直在闪;或者,画一根类似橡皮筋一样,跟着鼠标一直伸缩的线条时,将会发现屏幕一直闪个不停,解决这个问题的方法是,在内存中先构建好图片,然后再显示出来:
     添加this.SetStyle(ControlStyles.AllPaintingInWmPaint,true);
    this.SetStyle(ControlStyles.DoubleBuffer,true);
    this.SetStyle(ControlStyles.UserPaint,true);这三句话是表明每次先在缓存中画好控件,再刷新,这样便不会闪烁了
      

  11.   

    tabControlPanel2上放一个picturebox,将画的图放到picturebox中,直接在tabcontrolpanel上画就有这样的效果