2010-11-08 145 views
6

我畫一個圓窗形式如何在C#窗體中刪除繪製的圓形?

Pen pen = new Pen(Color.Black, 3); 
Graphics gr = this.CreateGraphics(); 
gr.DrawEllipse(pen, 5,5,20,20); 

如何刪除它...

+0

要麼具有所需顏色使用Graphics.Clear(),使用我張貼作爲一個答案的邏輯,或執行this.Invalidate()。最後只會強制表單重新繪製它的客戶區,這將有效地刪除該圓。 – 2010-11-08 14:23:14

+0

由於您正在使用'this.CreateGraphics',因此您可能沒有在Paint事件中繪製該圖標。這意味着任何時候你的表單被重新繪製(無論是因爲你調用了'Invalidate'方法還是因爲Windows發送了一個'WM_PAINT'消息),你的圓將被刪除。如果你希望這個圓是半永久的(至少要保持在那裏直到你明確地清除它),你需要確保你在你的表單的Paint事件處理器中繪製它,使用在事件的'PaintEventArgs'。 – 2010-11-08 14:37:48

+0

只需最小化窗口並重新恢復。 – 2010-11-08 14:38:39

回答

10

您可以作廢要刷新例如描繪區域:

this.Invalidate(); 

在表格上...

15

你要清楚你的圖形:

Graphics.Clear(); 

但是所有的繪製數字將被清除。簡而言之,您需要重新繪製除圓圈之外的所有圖形。

此外,您還可以使用Invalidate方法:

Control.Invalidate() 

它表示一個區域的圖形內重繪。但是如果你有相交的數字,你將不得不重新繪製你想要在該區域內可見的圖形,除了該圓形。

這可能會變得凌亂,您可能想了解如何設計一個control graph或使用任何圖形佈局library

+0

我沒有看到什麼控制圖(又名流程圖)與這個問題。 – 2010-11-08 14:38:49

+0

控制圖通常以圖形佈局引擎的構建方式爲基礎。因此,它可以幫助確定需要繪製或失效的內容。它只是一個開放的主題... – 2010-11-08 14:51:33

+2

有沒有Graphics.clear,如果你做圖形gr; GR = ....; gr.clear()會給出錯誤,因爲它需要參數,顏色 – barlop 2015-12-08 04:55:45

5

假設你訂閱Paint事件或重寫保護的OnPaint程序,那麼你將需要執行這樣的事情:

bool paint = false; 

protected override void OnPaint(object sender, PaintEventArgs e) 
{ 
    if (paint) 
    { 
    // Draw circle. 
    } 
} 

然後,當你想停下來畫一個圓圈:

paint = false; 
this.Invalidate(); // Forces a redraw 
+0

這樣做的好處是允許表單重繪它的客戶區域。使用Graphics.Clear將用純色繪製客戶區域。 – 2010-11-08 14:19:40

+0

如果一個正方形在圓內並且使圓周圍的區域無效,則正方形也將失效。使用這種技術,你將不得不畫出你想要看到的區域內的任何東西。 – 2010-11-08 14:20:52

+0

如果您只需將該邏輯放在條件檢查之外,並且在要重繪表單時強制失效,那麼這很容易完成。 OnPaint邏輯在表單無效時(或整個表單客戶區)每次調用。 – 2010-11-08 14:26:58

2

你不會「刪除」它本身,沒有什麼可以刪除的。這是一張圖紙,您可以在其上畫一些其他東西,或者您可以撥打Graphics.Clear()method

+0

你是對的,但是如果他在Paint/OnPaint中繪圖,那麼他可以簡單地包含一個標誌來繪製一個圓或者不繪製圓,然後使表單失效。表單的內部邏輯將重繪其沒有圈子的客戶區域。 – 2010-11-08 14:18:15

2

您可以使用您控制的背景色相同尺寸的身影在其中您繪製

使用你的代碼後清除你的身材。

Pen p = new Pen(this.BackColor); 
gr.DrawEllipse(p, 5,5,20,20); 
-4

從c中刪除繪製的圓圈非常簡單。

只有四個步驟: -

  1. 打開渦輪增壓應用
  2. 進入命令,你畫了圈
  3. 拖動命令
  4. 點擊刪除按鈕
2

如果您使用的是Invalidate()且無法使用,請撥打panel.Refresh()

這會對你有用。

+0

我認爲這個評論是解決方案.....無效的面板(窗體,選項卡,......)不是一個好主意....特別是在點擊或任何頻繁更改事件後需要更改圖形時..... – 2017-06-30 17:36:49

0

事實上,你可以可以刪除你的圈子,除了你的圈子。

您需要的所有內容都類似於您想要清除的區域的「之前狀態」的屏幕截圖,以便從中創建一個TextureBrush。你可以通過這樣的事情實現這一步:

Bitmap _Background = new Bitmap(this.Width, this.Height); 
Graphics.FromImage(_Background).CopyFromScreen(this.Left, this.Top, 0, 0, this.Size); 

第一行會給你一個位圖在你的Windows窗體大小。第二行將保存在_Background -bitmap中的截圖。

現在你創建一個TextureBrush出來的:

Brush brsBackground = new TextureBrush(_Background); 

你需要接下來的事情是你圈的尺寸,所以你應該把它們保存到一個變量,如果他們不是一個固定值。當你手頭有他們,你可以清除特定的區域是這樣的:

Graphics gr = this.CreateGraphics(); 
gr.FillEllipse(brsBackground, 5, 5, 20, 20); // values referred to your example 

完成!

即使是複雜的數字是能夠通過該被刪除,像GraphicsPath例如:

GraphicsPath gp = new GraphicsPath(); // any kind of GraphicsPath 
gr.FillRegion(brsBackground, new Region(gp));