Pregunta

¿Puedo eliminar el viejo rectángulo que he dibujado y dibujar un rectángulo nuevo?

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

No hay solución correcta

Otros consejos

No, no se puede "eliminar" algo que ya se ha dibujado. Puede sobreescritura con otra cosa, pero el dibujo con Graphics objetos es como pintar en la vida real: una vez que la pintura esté seca, sólo se puede pintar sobre ella con otro color, no se puede "borrado "la misma.

Probablemente no debería estar dibujando cosas en respuesta a una MouseClick, tampoco. Lo mejor es solamente dibujar cosas en respuesta a un evento Paint. Lo que haría en esta situación es añadir una estructura Rectangle a una lista en la MouseClick y luego llamar panel1.Invalidate() para pedirle que vuelva a dibujarse. Luego, en el caso Paint para el panel, haga lo dibujo allí.

Esto matar dos pájaros de un tiro, ya que será capaz de algo "borrado" por la simple eliminación de la lista de cosas para dibujar.

Esto se hace generalmente mediante el mantenimiento de una colección de objetos que desea dibujado. El clic del ratón debe actualizar esta colección y luego decirle a la ventana (o el efecto región) para refrescar. Esto tiene la enorme ventaja de preservar lo que ha dibujado si la ventana se mueve fuera de la pantalla, oculto detrás de otras ventanas, minimizado, etc.

Para una solución rudimentaria, crear una jerarquía de tipos estirables forma derivados de una clase de forma abstracta común, y el uso, por ejemplo, una lista para la colección. La clase de forma de la base tendrá un método Draw abstracta que la anulación clases derivadas.

Para una solución de potencia industrial más, mire a su alrededor para escenarios gráficos 2-D.

Uno puede usar métodos Graphics.Save() y Graphics.Restore(state) para eso. Por ejemplo:

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

Además, dependiendo de la aplicación, se podría contemplar la utilización de DrawReversibleFrame. Puede cambiar la ubicación del rectángulo llamando al método de compensación.

En lugar de llamar g.DrawRectangle (pluma, 100,100, 100, 200); , Mantener el rectángulo como un objeto que será dibujado por el objeto gráfico. Cada vez que se va a actualizar este objeto rectángulo con uno nuevo y gráficos objeto dibujará el nuevo.

La actualización debe borrar el viejo rectángulo y gráficos dibujará el nuevo.

Usted sólo puede usar PowerPacks VisualBasic, se incluye con mi versión de Visual Studio 2008

Aquí hay un código de ejemplo que va a dibujar un rectángulo sobre un cuadro de texto, es decir, lo que estoy dando un borde personalizado

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

El código es auto describir pero si usted tendría ningún problema, simplemente dejar un mensaje ...

Creo que usando DrawReversibleFrame es la solución correcta. La primera llamada dibujar el rectángulo, la segunda llamada undraw y así sucesivamente.

Aquí hay un código de ejemplo, un clic en el botón hará que aparezca el rectángulo / disapper.

Rectangle pRect = new Rectangle(10, 10, 20, 20);
private void rect_Click(object sender, EventArgs e)
{
  ControlPaint.DrawReversibleFrame(pRect, this.BackColor, FrameStyle.Thick);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top