¿Eliminar rectángulo usando .NET?

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

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, no puedes “borrar” algo que ya ha sido dibujado. Puedes sobrescribirlo con otra cosa, pero dibujar con objetos Graphics es como pintar en la vida real: una vez que la pintura está seca, solo puedes pintarla sobre otro color, no puedes “borrarla”.

Probablemente tampoco deberías estar dibujando cosas en respuesta a un MouseClick. Es mejor solo dibujar cosas en respuesta a un evento Paint . Lo que haría en esta situación es agregar una estructura de Rectangle a una lista en el MouseClick y luego llamar a panel1.Invalidate() para pedirle que se panel1.Invalidate() a dibujar. Luego, en el evento Paint para el panel, haga el dibujo allí.

Esto matará a dos pájaros de un tiro, porque podrás “borrar” algo simplemente eliminándolos de la lista de elementos para dibujar.

Esto generalmente se hace manteniendo una colección de objetos que desea dibujar. El clic del mouse debe actualizar esta colección y luego indicar a la ventana (o la región afectada) que se actualice. Esto tiene la enorme ventaja de conservar lo que haya dibujado si la ventana se mueve fuera de la pantalla, se oculta detrás de otras ventanas, se minimiza, etc.

Para una solución rudimentaria, cree una jerarquía de tipos de formas dibujables derivadas de una clase de forma abstracta común, y use, por ejemplo, una Lista para la colección. La clase de forma básica tendrá un método de dibujo abstracto que las clases derivadas anulan.

Para una solución de mayor fuerza industrial, mire a su alrededor en busca de gráficos en 2-D.

Uno puede usar los 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.restre.aspx

Además, dependiendo de la aplicación, puede considerar el uso de DrawReversibleFrame. Puede cambiar la ubicación del rectángulo llamando al método Offset.

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

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

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

Aquí hay un código de ejemplo que dibujará un rectángulo sobre un TextBox, es decir, le 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 se describe a sí mismo, pero si tuviera algún problema, simplemente deje un mensaje …

Creo que usar DrawReversibleFrame es la solución correcta. La primera llamada dibuja el rectángulo, la segunda llamada lo dibuja y así sucesivamente.

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

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