2017-10-04 4 views
0

내 양식에 그림이 있습니다. 이미지 위에 화살표를 그릴 수 있기를 원했습니다. 나는 그럭저럭 중간에 도착할 수 있었다. 양식로드 이벤트에서 나는 그림을 그림 상자에 할당합니다. 아래 코드로 화살표를 만들 수 있습니다. 문제는 양식을로드 할 때 할당 된 그림이 지워지는 화살표를 만들 때마다 발생합니다. 내 이미지가 지워지는 이유는 무엇입니까? 양식로드시 할당 된 이미지를 화살표를 그리는 동안 어떻게 유지합니까?Picturebox 이미지 위에 그림을 그려 유지

private bool isMoving = false; 
    private Point mouseDownPosition = Point.Empty; 
    private Point mouseMovePosition = Point.Empty; 
    private List<Tuple<Point, Point>> lines = new List<Tuple<Point, Point>>(); 
    Pen _Pen; 

    private void Test_Load(object sender, EventArgs e) 
    { 
     pictureBox1.Image = Properties.Resources.background;   
    } 

    private void pictureBox1_Paint(object sender, PaintEventArgs e) 
    { 

     if (isMoving) 
     { 
      if (pictureBox1.Image == null) 
      { 
       Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
       using (Graphics g = Graphics.FromImage(bmp)) 
       { 
        g.Clear(Color.White); 
       } 
       pictureBox1.Image = bmp; 
      } 

      using (Graphics g = Graphics.FromImage(pictureBox1.Image)) 
      { 
       g.Clear(pictureBox1.BackColor); 

       AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5); 
       _Pen = new Pen(Color.IndianRed, 3); 
       _Pen.CustomEndCap = bigArrow; 
       g.DrawLine(_Pen, mouseDownPosition, mouseMovePosition); 
       _Pen.Dispose(); 
      } 
     } 
    } 



    private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     isMoving = true; 
     mouseDownPosition = e.Location; 
    } 

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      mouseMovePosition = e.Location; 
      pictureBox1.Invalidate(); 
     } 
    } 

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e) 
    { 
     if (isMoving) 
     { 
      lines.Add(Tuple.Create(mouseDownPosition, mouseMovePosition)); 
     } 
     isMoving = false; 
    } 

나는 문제가 여기 g.Clear(pictureBox1.BackColor);

답변

1

이 행 네, 문제는 당신이 라인을 그리기 전에 여기 g.Clear(pictureBox1.BackColor); 당신은 전체 제어 영역을 지울이 줄을 함께으로 생각합니다.

당신은 직접 e.Graphics 그릴해야합니다

private void pictureBox1_Paint(object sender, PaintEventArgs e) 
{ 
    if (isMoving) 
    { 
     if (pictureBox1.Image == null) e.Graphics.Clear(Color.White); 

     // Add this line for high quality drawing: 
     e.Graphics.SmoothingMode = SmoothingMode.HighQuality; 

     AdjustableArrowCap bigArrow = new AdjustableArrowCap(5, 5); 
     _Pen = new Pen(Color.IndianRed, 3); 
     _Pen.CustomEndCap = bigArrow; 
     e.Graphics.DrawLine(_Pen, mouseDownPosition, mouseMovePosition); 
     _Pen.Dispose(); 
    } 
} 
+0

안녕 사쿠라,이 일했다. 고맙습니다! 이렇게하면 배경 이미지가 유지되고 그 위에 화살표가 그려 지지만 그림 상자 이미지가 배경 그림 위에 그려진 화살표와 같지 않은 이유를 알 수 있습니까? 필자가 테스트 한 방식은 다른 그림 상자 컨트롤을 내 양식에 넣고'picturebox2.image = picturebox1.image'를 쓴 것 뿐이었고 내 배경 이미지 만 표시했습니다. – taji01

+0

'if (pictureBox1.Image == null)'을'if (송신기를 PictureBox로 .Image == null)'로 변경하십시오. 어쨌든, 나는 당신의 의견을 분명히 이해하지 못합니다. 가능하다면 새로운 코드로 질문을 편집하십시오. 도움을 주실 수 있다면 알려 드리겠습니다. – Sakura

+0

안녕 사쿠라, 나는 여기서 도출 한 테스트를 통해 질문에 대해 더 자세히 질문했습니다. https://stackoverflow.com/questions/46592322/paint-drawline-image-into-picturebox-image – taji01

관련 문제