2010-03-30 60 views
2

我可以刪除我繪製的舊矩形並繪製一個新的矩形嗎?使用.NET刪除矩形?

private void panel1_MouseClick(object sender, MouseEventArgs e) 
{ 
     Graphics g = this.panel1.CreateGraphics(); 
     Pen pen = new Pen(Color.Black, 2); 

     g.DrawRectangle(pen, 100,100, 100, 200); 
     g.dispose(); 
} 
+1

調用panel1.Refresh()。不要直接繪製,請使用Paint事件。 – 2010-03-30 13:02:08

+0

是的,它適合我,非常感謝。 – Dinu 2010-03-30 15:32:28

回答

2

這通常是通過維護要繪製的對象的集合來完成的。鼠標點擊應該更新這個集合,然後告訴窗口(或影響區域)刷新。如果窗口被移出屏幕,隱藏在其他窗口的後面,最小化等等,這具有保留您繪製的任何東西的巨大優點。

對於基本的解決方案,創建一個從公共派生的可繪製形狀類型的層次結構抽象Shape類,並使用例如集合的List。基礎Shape類將具有派生類重寫的抽象Draw方法。

對於更具工業強度的解決方案,請查看二維場景圖。

5

不,你不能「刪除」已經繪製的東西。你可以用其他東西覆蓋,但用Graphics來繪製物體就像在現實生活中繪畫一樣:一旦油漆乾燥,只能用另一種顏色塗抹它,你不能「抹去」它。

您可能不應該繪製事物以響應MouseClick。最好是只有爲了響應Paint事件而畫東西。在這種情況下,我會做的是將一個Rectangle結構添加到MouseClick上的列表中,然後致電panel1.Invalidate()要求它重繪本身。然後在面板的Paint事件中,在那裏執行繪圖。

這會一箭雙鵰,因爲只需將它們從要繪製的東西中刪除即可「抹去」。

0

而不是調用g.DrawRectangle(pen,100,100,100,200); ,將該矩形保持爲將由圖形對象繪製的對象。每當你用新的矩形對象更新時,圖形對象將繪製新的矩形對象。

刷新應清除舊的矩形,圖形將繪製新的矩形。

0

您可以只使用VisualBasic中的PowerPack,它是隨我的版本的Visual Studio 2008

這裏是一個示例代碼,將繪製一個矩形在一個文本框,即我給它一個定義邊框

Dim x = TextBox1.Location.X 
    Dim y = TextBox1.Location.Y 
    Dim width = TextBox1.Width 
    Dim height = TextBox1.Height 
    Dim ShapeContainer1 As New Microsoft.VisualBasic.PowerPacks.ShapeContainer 
    Me.Controls.Add(ShapeContainer1) 
    Dim RectangleShape1 As New Microsoft.VisualBasic.PowerPacks.RectangleShape 
    ShapeContainer1.Shapes.AddRange(New Microsoft.VisualBasic.PowerPacks.Shape() {RectangleShape1}) 
    RectangleShape1.Location = New System.Drawing.Point(x - 1, y - 1) 
    RectangleShape1.Size = New System.Drawing.Size(width + 1, height + 1) 
    RectangleShape1.BorderColor = Color.MistyRose 
    ShapeContainer1.Refresh() 

代碼是自描述,但如果你有任何問題,只是留言...

+0

是的,如果你想刪除矩形,只需處理控件(矩形或ShapeContainer),沒有繪畫,沒有麻煩! – CandorZ 2010-12-28 15:53:40

1

我們可以使用Graphics.Save()Graphics.Restore(state)方法這一點。例如:

private void SaveRestore2(PaintEventArgs e) 
{ 
    // Translate transformation matrix. 
    e.Graphics.TranslateTransform(100, 0); 

    // Save translated graphics state. 
    GraphicsState transState = e.Graphics.Save(); 

    // Reset transformation matrix to identity and fill rectangle. 
    e.Graphics.ResetTransform(); 
    e.Graphics.FillRectangle(new SolidBrush(Color.Red), 0, 0, 100, 100); 

    // Restore graphics state to translated state and fill second 

    // rectangle. 
    e.Graphics.Restore(transState); 
    e.Graphics.FillRectangle(new SolidBrush(Color.Blue), 0, 0, 100, 100); 
} 

http://msdn.microsoft.com/en-us/library/system.drawing.graphics.restore.aspx

1

此外,根據不同的應用,你可以看看使用DrawReversibleFrame。您可以通過調用Offset方法來更改矩形的位置。

0

我認爲使用DrawReversibleFrame是正確的解決方案。 第一次調用繪製矩形,第二次調用未繪製它等等。

下面是一個示例代碼,按鈕上的clic會使矩形顯示/消失。

Rectangle pRect = new Rectangle(10, 10, 20, 20); 
private void rect_Click(object sender, EventArgs e) 
{ 
    ControlPaint.DrawReversibleFrame(pRect, this.BackColor, FrameStyle.Thick); 
}