C # Недействительные проблемы - PullRequest
2 голосов
/ 01 марта 2012

Я пытаюсь переместить нарисованный графический элемент, я могу нарисовать его просто отлично. но когда я пытаюсь переместить его, он просто рисует другой элемент поверх оригинала. Я пробовал Invalidate, и pictureBox1.Invalidate. до сих пор не повезло, просто печатает оба элемента на картинке. Спасибо за любые предложения.

     private void button1_Click(object sender, EventArgs e)
    {
        count++;
        button1.Text = "Move";

        if (count == 1)
        {

         car();
        }
        else if (count == 2)
        {

            car1();
        }
    }
    public void car()
    {
        Invalidate();
        g = pictureBox1.CreateGraphics();
        g.DrawEllipse(pen1, 50, 125, 30, 30);
        g.DrawEllipse(pen1, 150, 125, 30, 30);
        g.DrawRectangle(pen2, 45, 75, 140, 50);
        g.DrawLine(pen2, 65, 75, 80, 35);
        g.DrawLine(pen2, 80, 35, 140, 35);
        g.DrawLine(pen2, 140, 35, 160, 75);
        // Create string to draw.
        String drawString = "Price: "+(cost).ToString("C");
        // Create font and brush.
        Font drawFont = new Font("Arial", 16);
        SolidBrush drawBrush = new SolidBrush(Color.Black);
        // Create point for upper-left corner of drawing.
        PointF drawPoint = new PointF(50, 95);
        // Draw string to screen.
        g.DrawString(drawString, drawFont, drawBrush, drawPoint);

    }
    public void car1()
    {
        Invalidate(); 
        g = pictureBox1.CreateGraphics();
        g.DrawEllipse(pen1, 50 + m, 125, 30 , 30 );
        g.DrawEllipse(pen1, 150 + m, 125, 30 , 30);
        g.DrawRectangle(pen2, 45 + m, 75, 140, 50 );
        g.DrawLine(pen2, 65 + m, 75, 80 + m, 35);
        g.DrawLine(pen2, 80 + m, 35, 140 + m, 35);
        g.DrawLine(pen2, 140 + m, 35, 160 + m, 75);
        // Create string to draw.
        String drawString = "Price: " + (cost).ToString("C");
        // Create font and brush.
        Font drawFont = new Font("Arial", 16);
        SolidBrush drawBrush = new SolidBrush(Color.Black);
        // Create point for upper-left corner of drawing.
        PointF drawPoint = new PointF(50 + m, 95);
        // Draw string to screen.
        g.DrawString(drawString, drawFont, drawBrush, drawPoint);
    }

1 Ответ

3 голосов
/ 01 марта 2012

Переместите свой код в событие Paint в окне рисунка и используйте графический объект из доступных аргументов.

private void pictureBox1_Paint(object sender, PaintEventArgs e) {
  e.Graphics.Clear(Color.White);

  if (count == 1)
    DrawCar1(e.Graphics);

  if (count == 2)
    DrawCar2(e.Graphics);
}

public void DrawCar1(Graphics g)
{
  g.DrawEllipse(pen1, 50, 125, 30, 30);
  g.DrawEllipse(pen1, 150, 125, 30, 30);
  // etc.
}

public void DrawCar2(Graphics g)
{
  // etc.
}

private void button1_Click(object sender, EventArgs e)
{
  count++;
  button1.Text = "Move";
  pictureBox.Invalidate();
}

Ваш код никогда не очищал PictureBox, только форму, но это ошибка для использования CreateGraphics() потому что это просто временное полотно.Например, любой рисунок, использующий этот метод, стирается, когда вы минимизируете форму.

Возможно, ваш код должен быть реорганизован в класс "Car".Наличие рутины Car1 и Car2 не очень практично.Если вы хотите продолжать перемещать его, вы не хотите продолжать добавлять больше процедур Car #.Создайте отдельную процедуру рисования для автомобиля и сохраните информацию о местоположении в классе «Автомобиль», чтобы вы знали, «где» вы хотите нарисовать автомобиль.

...