2012-03-01 3 views
2

그려진 그래픽 항목을 옮기려고합니다. 그러나 그것을 옮기려고 할 때 원래의 것 위에 또 다른 항목을 그립니다. Invalidate 및 pictureBox1.Invalidate를 시도했습니다. 여전히 행운은 그냥 두 항목을 pictureBox에 인쇄합니다. 제안 해 주셔서 감사합니다.C# 문제를 무효화하십시오.

 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 # 루틴을 계속 추가하고 싶지는 않습니다. 자동차에 대한 단일 드로잉 루틴을 작성하고 "Car"클래스에 위치 정보를 유지하여 "어디에서"자동차를 그려야하는지 알 수 있습니다.

+0

좋아요, 저는 자동차 도면을위한 클래스를 만들었지 만, 그것을 만들 때 오류 2가 발생합니다. 포함 된 문은 선언문이나 레이블이없는 문일 수 없습니다. – Sloshy