2011-04-27 2 views
0

마우스를 움직일 때 사각형이 그려지는 C#으로 작은 응용 프로그램을 만들었습니다.이미지 작성시 저장

그러나 양식을 최소화하거나 최대화하면 도면이 지워집니다. 또한 두 번째 그림을 그리면 첫 번째 사각형의 그리기가 지워집니다.

이 문제를 어떻게 해결할 수 있습니까? 당신이 CreateGraphics 메서드를 호출하여 얻은 Graphics 객체로 그리기 있기 때문에

int X, Y; 
    Graphics G; 
    Rectangle Rec; 
    int UpX, UpY, DwX, DwY; 


    public Form1() 
    { 
     InitializeComponent(); 
     //G = panel1.CreateGraphics(); 
     //Rec = new Rectangle(X, Y, panel1.Width, panel1.Height); 
    } 


    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     UpX = e.X; 
     UpY = e.Y; 
     //Rec = new Rectangle(e.X, e.Y, 0, 0); 
     //this.Invalidate(); 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     DwX = e.X; 
     DwY = e.Y; 

     Rec = new Rectangle(UpX, UpY, DwX - UpX, DwY - UpY); 
     Graphics G = pictureBox1.CreateGraphics(); 
     using (Pen pen = new Pen(Color.Red, 2)) 
     { 
      G.DrawRectangle(pen, Rec); 
     } 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    {    
     if (e.Button == MouseButtons.Left) 
     { 
      // Draws the rectangle as the mouse moves 
      Rec = new Rectangle(UpX, UpY, e.X - UpX, e.Y - UpY); 
      Graphics G = pictureBox1.CreateGraphics(); 

      using (Pen pen = new Pen(Color.Red, 2)) 
      { 
       G.DrawRectangle(pen, Rec); 
      } 
      G.Save(); 
      pictureBox1.SuspendLayout(); 
      pictureBox1.Invalidate(); 

     } 

    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 
     pictureBox1.Update();    
    } 
+2

모든 단일 단어를 대문자로 표기하지 않아도됩니다. – alex

답변

2

당신의 그림이 지워지고 이유는 다음과 같습니다 여기에 내가 현재 가지고있는 코드입니다. 특히, 당신의 코드 줄이 잘못되었습니다 :

양식이 최대화 최소화 될 때 화면에 다른 개체에 의해 덮여 발생, 또는 어떤 ( 을 다시 칠 때마다 당신이 발견 한 것처럼
Graphics G = pictureBox1.CreateGraphics(); 

, 다른 여러 가지 상황에서) 임시 Graphics 개체로 가져온 모든 것을 잃게됩니다. 폼은 내부 페인팅 로직으로 완전히 다시 그려집니다. 일시적으로 그 위에 무엇을 그린 것인지 완전히 잊어 버렸습니다.

윈폼에서 지속적 이미지를 그릴 수있는 올바른 방법은 (당신은 또한 Paint event을 처리 할 수있는, 또는) 당신이에 그리 할 컨트롤의 OnPaint method을 무시하는 것입니다. (

protected override void OnPaint(PaintEventArgs e) 
{ 
    // Call the base class first 
    base.OnPaint(e); 

    // Then insert your custom drawing code 
    Rec = new Rectangle(UpX, UpY, DwX - UpX, DwY - UpY); 
    using (Pen pen = new Pen(Color.Red, 2)) 
    { 
     e.Graphics.DrawRectangle(pen, Rec); 
    } 
} 

그리고 다시 페인트를 트리거하기 위해, 당신은 단지 마우스 이벤트의에서 Invalidate method 전화 MouseDown을 : 당신은 당신의 폼으로 칠하고 싶어한다면, 다음과 같은 방법으로 드로잉 코드를 삽입 할 것 , MouseMoveMouseUp) : 그러나

this.Invalidate(); 

참고는 Paint 이벤트 처리기에서 Update method를 호출 할 이유는 전혀 없다 있음. Update 메서드를 호출하는 모든 컨트롤이 강제로 다시 그려집니다. 하지만 Paint 이벤트가 발생하면 이미 발생합니다!