Domanda

È possibile eliminare il vecchio rettangolo che ho disegnato e disegnare un nuovo rettangolo?

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();
}

Nessuna soluzione corretta

Altri suggerimenti

No, non è possibile "eliminare" qualcosa che è già stato disegnato. È possibile sovrascrittura con qualcos'altro, ma il disegno di oggetti Graphics è come la pittura nella vita reale: una volta che la vernice è asciutta, si può dipingere solo su di esso con un altro colore, non è possibile "erase "esso.

Probabilmente non dovrebbe essere disegnando le cose in risposta ad un click del mouse, sia. E 'meglio solo disegnare le cose in risposta a un evento Paint. Quello che vorrei fare in questa situazione è aggiungere una struttura Rectangle a un elenco sulla MouseClick e quindi chiamare panel1.Invalidate() per chiedere di ridisegnare se stessa. Poi, nel caso Paint per il pannello, fare il disegno lì.

In questo modo prendere due piccioni con una fava, perché si sarà in grado di "cancellare" la cosa semplicemente rimuoverli dalla lista di cose da disegnare.

Questo è solitamente fatto mantenendo una collezione di oggetti che si desidera disegnato. Il clic del mouse dovrebbe aggiornare questa collezione e poi dire la finestra (o della regione influenzare) per aggiornare. Questo ha l'enorme vantaggio di conservare tutto ciò che hai disegnato se la finestra viene spostata fuori dallo schermo, nascosta dietro altre finestre, ridotto al minimo, ecc.

Per una soluzione rudimentale, creare una gerarchia di tipi disegnabili forme derivate da una comune classe di forma astratta, e l'uso, per esempio, un elenco per la raccolta. La classe Shape base avrà un metodo astratto draw che le classi derivate hanno la precedenza.

Per una soluzione più industriale-resistenza, guardarsi intorno per 2-D scena grafici.

Si può usare metodi Graphics.Save() e Graphics.Restore(state) per questo. Ad esempio:

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/ it-it / library / system.drawing.graphics.restore.aspx

Inoltre, a seconda dell'applicazione, si potrebbe guardare con DrawReversibleFrame. È possibile modificare la posizione rettangolo di chiamando il metodo Offset.

Invece di chiamare g.DrawRectangle (penna, 100,100, 100, 200); , Di mantenere il rettangolo come un oggetto che sarà disegnato da l'oggetto grafico. Ogni volta che si aggiornare l'oggetto rettangolo con una nuova grafica e opporsi trarrà quello nuovo.

L'aggiornamento dovrebbe cancellare il vecchio rettangolo e la grafica trarrà il nuovo.

Si può semplicemente utilizzare PowerPack VisualBasic, è incluso con la mia versione di Visual Studio 2008

Ecco un esempio di codice che disegnare un rettangolo su un TextBox, vale a dire io sto dando un bordo personalizzato

    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()

Codice è auto descrivere, ma se avessi qualche problema, basta lasciare un messaggio ...

Credo che utilizzando DrawReversibleFrame è la soluzione giusta. La prima chiamata disegnare il rettangolo, la seconda chiamata undraw, e così via.

Ecco un codice di esempio, un clic sul pulsante farà apparire il rettangolo / disapper.

Rectangle pRect = new Rectangle(10, 10, 20, 20);
private void rect_Click(object sender, EventArgs e)
{
  ControlPaint.DrawReversibleFrame(pRect, this.BackColor, FrameStyle.Thick);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top