¡CASI tengo Graphics permanente!
Publicado por Ricardo Martínez (6 intervenciones) el 21/07/2004 03:04:18
Hola, quiero dibujar gráficos persistentes o permanentes (que no se borren si les ponen una ventana encima, o se cabia el tamaño del formulario, o se minimiza, etc. El famoso "AutoRedraw" en VB 6, "hágalo usted mismo" en VB.NET) sin necesidad de poner métodos gráficos en el evento Paint debido a su ineficiencia en casos complejos. Leí en un foro que esto se hace dibujando en la imagen del control, no en el control mismo, ya que las imagenes persisten aunque las cubra el monte Fuji.
He mejorado una función que encontré en un foro:
Function CrearGraficosFijos(ByVal cajaImagen As PictureBox) As Graphics
Dim ImagenBMP As New Bitmap(cajaImagen.Width, cajaImagen.Height)
If cajaImagen.Image Is Nothing Then
cajaImagen.Image = ImagenBMP
Else
Graphics.FromImage(ImagenBMP).DrawImage(cajaImagen.Image, 0, 0)
cajaImagen.Image = ImagenBMP
End If
Return Graphics.FromImage(ImagenBMP)
End Function
Explicación sencillita: La primera vez, si el PictureBox no tiene una imagen, se le asigna una nueva, si ya tenía una imagen, la nueva imagen sobre la que se dibujará será la que ya contenía el PictureBox para no perder su imagen anterior. Al final, se devuelve un Graphics asociado a su imagen.
Listo, tengo dos botones y un PictureBox llamado pct1:
Private G As Graphics
Private Sub cmdCrearGraficos_Click(...) Handles cmdCrearGraficos.Click
G = CrearGraficosFijos(pct1)
End Sub
Private Sub cmdDibujar_Click(...) Handles cmdDibujar.Click
G.DrawLine(Pens.Chocolate, 0, 0, 50, 50)
G.DrawEllipse(Pens.Chocolate, 0, 0, 50, 50)
End Sub
Este procedimiento funciona perfectamente:
Sub CrearYDibujar()
cmdCrearGraficos.PerformClick()
cmdDibujar.PerformClick()
End Sub
Puesto que muestra inmediatamente lo que se ha dibujado. PERO, si el usuario oprime los dos botones en ese orden hay necesidad de refrescar el PictureBox (pct1.Refresh) para que muestre lo que se ha dibujado. ¿¿¿POR QUÉ??? Si se ejecutan los mismos procedimientos en el mismo orden.
La escencia de mi programa es la velocidad para dibujar un sinnúmero de figuras. Así que no puedo refrescar el control cada vez que dibujo en él.
Agradezco ENORMEMENTE la ayuda que me pueda dar. (SI, ¡USTED!, el que está sentado decidiendo aún si me ayuda o no, ¡vamos!, ¡ayúdeme!, ¡por favor!)
He mejorado una función que encontré en un foro:
Function CrearGraficosFijos(ByVal cajaImagen As PictureBox) As Graphics
Dim ImagenBMP As New Bitmap(cajaImagen.Width, cajaImagen.Height)
If cajaImagen.Image Is Nothing Then
cajaImagen.Image = ImagenBMP
Else
Graphics.FromImage(ImagenBMP).DrawImage(cajaImagen.Image, 0, 0)
cajaImagen.Image = ImagenBMP
End If
Return Graphics.FromImage(ImagenBMP)
End Function
Explicación sencillita: La primera vez, si el PictureBox no tiene una imagen, se le asigna una nueva, si ya tenía una imagen, la nueva imagen sobre la que se dibujará será la que ya contenía el PictureBox para no perder su imagen anterior. Al final, se devuelve un Graphics asociado a su imagen.
Listo, tengo dos botones y un PictureBox llamado pct1:
Private G As Graphics
Private Sub cmdCrearGraficos_Click(...) Handles cmdCrearGraficos.Click
G = CrearGraficosFijos(pct1)
End Sub
Private Sub cmdDibujar_Click(...) Handles cmdDibujar.Click
G.DrawLine(Pens.Chocolate, 0, 0, 50, 50)
G.DrawEllipse(Pens.Chocolate, 0, 0, 50, 50)
End Sub
Este procedimiento funciona perfectamente:
Sub CrearYDibujar()
cmdCrearGraficos.PerformClick()
cmdDibujar.PerformClick()
End Sub
Puesto que muestra inmediatamente lo que se ha dibujado. PERO, si el usuario oprime los dos botones en ese orden hay necesidad de refrescar el PictureBox (pct1.Refresh) para que muestre lo que se ha dibujado. ¿¿¿POR QUÉ??? Si se ejecutan los mismos procedimientos en el mismo orden.
La escencia de mi programa es la velocidad para dibujar un sinnúmero de figuras. Así que no puedo refrescar el control cada vez que dibujo en él.
Agradezco ENORMEMENTE la ayuda que me pueda dar. (SI, ¡USTED!, el que está sentado decidiendo aún si me ayuda o no, ¡vamos!, ¡ayúdeme!, ¡por favor!)
Valora esta pregunta


0