Как сделать так, чтобы изображение плавно двигалось?

У меня есть изображение PictureBox в форме, которая перемещается при движении мыши по панели.

Он движется так, как я хочу, однако он все время мерцает (например, обновления), и я узнал, что это проблема с формами.

Я попробовал следующие строки кода в конструкторе моей формы, но безуспешно:

SetStyle( ControlStyles.ResizeRedraw, true );

SetStyle( ControlStyles.UserPaint, true );

SetStyle( ControlStyles.AllPaintingInWmPaint, true );   

SetStyle( ControlStyles.OptimizedDoubleBuffer, true );    

Это обработчик события движения мыши, если он помогает увидеть всю картинку. chipHolder — это панель, а image — это изображение, импортированное из файла соответственно.

private void grid_MouseMove(object sender, MouseEventArgs e)
{ 
      columnPosition = e.X;

      if (columnPosition != -1)
      {
          if (!(columnPosition < 35 || columnPosition > 610))
          {
                chipHolder.Controls.Clear();  
                PictureBox picBox = new PictureBox();
                chipHolder.Controls.Add(picBox);
                picBox.Image = image;
                picBox.Width = image.Width;
                picBox.Height = image.Height;
                picBox.Location = new Point(columnPosition - 33, 0);
                picBox.Show();
          }
      }
      chipHolder.Update();
}

Любые идеи?


person Bernice    schedule 27.11.2012    source источник


Ответы (2)


Не пересоздавайте PictureBox, просто переместите его.

Только что попробовал это, и изображение движется без мерцания:

private void button1_Click(object sender, EventArgs e)
{
    for (int iter = 0; iter < 500; iter++)
    {
        pictureBox1.Location = new Point(pictureBox1.Left + 1, pictureBox1.Top + 1);
        Application.DoEvents();
        System.Threading.Thread.Sleep(30);
    }
}

Для движений мыши:

private void Form1_MouseMove(object sender, MouseEventArgs e)
{
    pictureBox1.Location = new Point(e.X, e.Y);
}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    pictureBox1.Location = new Point(e.X + pictureBox1.Left, e.Y + pictureBox1.Top);
}
person Igor    schedule 27.11.2012
comment
Спасибо за ваш ответ. Да, это устраняет мерцание.. но мне нужно, чтобы изображение двигалось вместе с движением мыши.. Не +1 за каждую итерацию. Я попытался включить это: Application.DoEvents(); Система.Threading.Thread.Sleep(30); в событиях Mouse_mouve, но все же:/ - person Bernice; 28.11.2012
comment
еще что? Что вы видите, и как вы хотите, чтобы это было по-другому? Я добавил код, который перемещает изображение с помощью мыши в свой ответ. Удалить chipHolder.Update(); звоните, достаточно просто изменить расположение окна с изображением. - person Igor; 28.11.2012

Что сказал Игорь:

private void grid_MouseMove(object sender, MouseEventArgs e)
{ 
      columnPosition = e.X;

      if (columnPosition != -1)
      {
          if (!(columnPosition < 35 || columnPosition > 610))
          {
                PictureBox picBox = chipHolder.Controls[0] // whatever your picbox id is;
                picBox.Location = new Point(columnPosition - 33, 0);
          }
      }
}
person Heather    schedule 27.11.2012