2012-03-01 3 views
2

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

 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); 
    } 
+0

Я отбросил вопрос в исходное состояние, так как вы принципиально изменили вопрос на что-то еще. Если у вас есть «новый» вопрос, не стесняйтесь задавать новый вопрос, и вы можете ссылаться на это сообщение для получения дополнительной информации. – LarsTech

ответ

3

Переместите свой код в событие 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(), потому что это просто временное полотно. Любой рисунок с использованием этого метода уничтожается, например, при минимизации формы.

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

+0

В порядке, я создал класс для чертежа автомобиля, но когда я его создаю, я получаю сообщение Error 2 Embedded не может быть объявлением или помеченной инструкцией – Sloshy