2016-06-19 2 views
0

사실이 주제와 관련하여 비슷한 질문이 있지만 찾고있는 답변을 볼 수 없습니다.양식에서 그려진 선을 삭제하는 방법은 무엇입니까?

예를 들어 창문에 2 줄을 그려 넣었습니다. 그 중 하나를 삭제하고 다른 것을 계속 사용하려면, 어떻게해야합니까?

this.Invalidate(); 또는 Graphics.Clear(); 모든 양식을 지우고 싶습니다. 원하지 않습니다. 특정 줄을 삭제하고 싶습니다. 다른 해결책이 있습니까?

+2

CreateGraphics를 사용하지 마십시오 !! –

+1

유일한 방법은 그리는 lines__ __list에서 삭제할 행을 삭제하는 것입니다. 페인트 이벤트에서 항상 한 번에 모든 도형을 그립니다. 그려야 할 도형의 목록이 없다면 꼭 가져야합니다. 너는 그것을 필요로한다. 우리를 믿으십시오. MSDN의 끔찍한 드로잉 소개에서 유감스럽게도, '종이에 그려진 선'이라는 오해를 불러 일으킬 수있는 비유에 이르기까지 다른 현명한 조언을 무시하십시오. 이것은 전혀 비슷하지 않습니다. 사실 그것은 완전히 다릅니다! – TaW

+0

[this post] (http://stackoverflow.com/questions/32408229/select-drawn-figure-within-panel-box/32422295#32422295)를 공부하는 것이 좋습니다. - 짧은 대답 : 당신은 __have__ 라인, 당신은 단지 픽셀을 색칠하지 않습니다. 그리고 : __ 당신은 픽셀을 뺄 수 없으므로 __ 전체 그림을 다시 만들어야합니다. 미친 듯이 낭비하는 소리가 들리지만 갈 길이 멀고 실제로는 빠르게 작동합니다. – TaW

답변

0

다음은 생성 된 모든 행을 역순으로 삭제합니다.

Graphics g; 
    Pen p; 
    Bitmap bmp; 
    List<Point> Lines = new List<Point>(); 

    private void Form2_Load(object sender, EventArgs e) 
    { 
     bmp = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
     BackgroundImage = bmp; 
     g = Graphics.FromImage(BackgroundImage); 
     g.Clear(Color.DeepSkyBlue); //This is our backcolor 
    } 

    private void btnLine1_Click(object sender, EventArgs e) 
    { 
     Point A = new Point(50, 50); 
     Point B = new Point(100, 50); 
     p = new Pen(Color.Red); 
     g.DrawLine(p, A, B); //Use whatever method to draw your line 
     Lines.Add(A); //Grab the first point; add to list 
     Lines.Add(B); //Grab the second point; add to list 
     Refresh(); //Refresh drawing to bitmap. 
    } 

    private void btnDrawLine2_Click(object sender, EventArgs e) 
    { 
     Point A = new Point(50, 60); 
     Point B = new Point(100, 60); 
     p = new Pen(Color.White); 
     g.DrawLine(p, A, B); //Same logic as above 
     Lines.Add(A); 
     Lines.Add(B); 
     Refresh(); 
    } 

    private void btnUndo_Click(object sender, EventArgs e) 
    { 
     c = new Pen(Color.DeepSkyBlue); 
     r = new Pen(lastColor.ElementAt(lastColor.Count - 2)); 
     try 
     { 
      g.DrawLine(c, Lines.ElementAt(Lines.Count - 2), Lines.ElementAt(Lines.Count - 1)); 
      Lines.RemoveAt(Lines.Count - 2); 
      Lines.RemoveAt(Lines.Count - 1); 
      for (int i = Lines.Count; i > 0; i--) 
      { 
      g.DrawLine(r, Lines.ElementAt(Lines.Count - 2), Lines.ElementAt(Lines.Count - 1)); 
      } 
     } 
     catch { } 
     Refresh(); 
    } 

여기 옆에 2 개 라인 측의 :

Result1

여기 중복이 개 라인이다 :

Result2

* 그래픽 객체를 처리하는 것을 잊지 마십시오!

+0

다른 선을 가로 지르는 한 선을 그립니다. 기본 선의 비트도 제거합니다. –

+0

@ LasseV.Karlsen이 수정을 시도하십시오. –

+0

보기 모델을 사용하여 모든 도면을 담당하는 하나의 함수 만 만들면됩니다. 그런 다음 새 라인을 추가하는 버튼은 아무 것도 그릴 필요가 없으며 뷰 모델을 업데이트합니다. 지금 당신이 가지고있는 것은 유지하기가 거의 불가능한 많은 복제입니다. –

관련 문제