2016-06-19 10 views
0

На самом деле есть несколько подобных вопросов по этой теме, но я не мог видеть ответ, что я ищу.Как удалить нарисованную линию на форме?

Например, я нарисовал 2 строки на форме окна и Я хочу удалить один из них и сохранить другой, как я могу это сделать?

this.Invalidate(); или Graphics.Clear(); очистить все формы, я не хочу этого, я хочу, чтобы удалить конкретную строку. Есть ли у вас какие-либо другие решения?

+2

Не используйте CreateGraphics !! –

+1

Единственный способ удалить строку, которую вы хотите удалить, из __ списка строк, которые вы рисуете. Всегда рисуйте все фигуры за один раз в событии рисования. Если у вас нет такого списка фигур, который вы хотите нарисовать, тогда вы должны иметь. Вы нуждаетесь в этом. Поверь нам. Игнорируйте все глупые советы, в которых говорится, что другие мудрые, из ужасного вступления MSDN на рисунок, к сожалению, вводящую в заблуждение аналогию с «линией, нарисованной на бумаге». Это совсем не похоже. На самом деле это совершенно другое !!! – TaW

+0

Возможно, вы захотите изучить [этот пост] (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

Вот 2 строки перекрывающихся:

Result2

* Не забудьте утилизировать свои графические объекты!

+0

Нарисуйте одну линию, пересекающую другую, и наблюдайте, как она удаляет биты базовой линии. –

+0

@ LasseV.Karlsen Хорошо, попробуйте это редактирование. –

+0

Просто выполните одну функцию, отвечающую за весь рисунок, используя модель представления. Затем кнопкам для добавления новых строк не нужно ничего рисовать, они просто обновляют модель представления. У вас сейчас много дублирования, которое практически невозможно поддерживать. –