2016-06-19 56 views
0

其實有關於這個話題的一些類似的問題,但我看不到答案我在找什麼。如何刪除表單上的繪製線?

例如我在Windows窗體上繪製了2行並且我想刪除其中一個並保留其他,我該怎麼做?我想刪除特定行。你有其他解決方案嗎?

+2

不要使用CreateGraphics! –

+1

唯一的方法是從你繪製的__list行中刪除你想要刪除的行。始終在繪畫事件中一次繪製所有形狀。如果你沒有這種你想繪製的形狀列表,那麼你應該有。你需要它。相信我們。忽略所有其他明智的愚蠢建議,從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(); 
    } 

下面是兩行並排:

Result1

下面是兩行重疊:

Result2

*請記住,處置您的圖形對象!

+0

畫一條線越過另一條線並觀察它也移除底層線的位。 –

+0

@ LasseV.Karlsen好的,試試這個編輯。 –

+0

只需使用視圖模型使一個函數負責所有繪圖。然後添加新行的按鈕不需要繪製任何東西,它們只是更新視圖模型。你現在擁有的是大量的重複,這幾乎不可能維持。 –