日期:2014-05-18  浏览次数:20920 次

图形闪烁,怎么解决???
这是我的代码,window窗体中只有3个button控件和两个timer控件。程序运行时,所画的圆在移动过程中总是会闪烁。怎么办啊???
 public partial class Form1 : Form
  {
  private int l = 100;
  //private int m = 3;
  private int x1 = 30;
  private int x = 0;
  private int y = 30;

  public Form1()
  {
  InitializeComponent();
  SetStyle(ControlStyles.UserPaint, true);
  SetStyle(ControlStyles.AllPaintingInWmPaint, true);//防止窗口跳动
  SetStyle(ControlStyles.DoubleBuffer, true);
  }

  private void paint_circle(int x)
  {
  Graphics g = this.CreateGraphics();
  g.SmoothingMode = SmoothingMode.HighSpeed; ;
  Image i = new Bitmap(this.Size.Width, this.Size.Height);
  Graphics k = Graphics.FromImage(i);
  g.FillEllipse(new SolidBrush(Color.Blue), x, y, l, l);
  g.DrawEllipse(new Pen(Color.Red, 3), x, y, l, l);
  g.DrawImage(i, 0, 0);
  g.Dispose();

  }

  private void button1_Click(object sender, EventArgs e)
  {
  this.Refresh();
  this.paint_circle(x1);
  //this.Invalidate();
  }
  //右移
  private void button3_Click(object sender, EventArgs e)
  {
  x = x1;
  timer2.Stop();
  timer1.Start();
  }
  //左移
  private void button2_Click(object sender, EventArgs e)
  {
  timer1.Stop();
  timer2.Start();
  }
  //右移
  private void timer1_Tick(object sender, EventArgs e)
  {
  this.Invalidate(false);
  timer1.Interval = 10;
  if ( x + l < this.Location.X + this.Size.Width )
  {
  x++;
  this.Refresh();
  this.paint_circle(x);
  }
  }
  //左移
  private void timer2_Tick(object sender, EventArgs e)
  {
  this.Invalidate(false);
  timer1.Interval = 10;
  if ( x > x1 )
  {
  x--;
  this.Refresh();
  this.paint_circle(x);
   
  }
  }
  }

------解决方案--------------------
最近老夫特别喜欢帮别人解决问题,
在你代码上修改了一下,只实现了向右移,你可以举一返三;
直接上代码 ,不解释
C# code

    public partial class Form1 : Form
    {
        private int l = 100;
        private int x1 = 30;
        private int x = 0;
        private int y = 30;

        public Form1()
        {
            InitializeComponent();
            SetStyle(ControlStyles.UserPaint, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);//防止窗口跳动
            SetStyle(ControlStyles.DoubleBuffer, true);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
        }

        Pen pen = new Pen(Brushes.Red, 3);
        Brush brush = Brushes.Blue;

        private void paint_circle(Graphics g, int x)
        {
            g.FillEllipse(brush, x, y, l, l);
            g.DrawEllipse(pen, x, y, l, l);
        }

        //右移
        private void button3_Click(object sender, EventArgs e)
        {