Visual Basic.NET - ¡CASI tengo Graphics permanente!

 
Vista:

¡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!)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¡CASI tengo Graphics permanente!

Publicado por Edgar (1501 intervenciones) el 21/07/2004 15:55:01
Hola

Pues, si entiendo bien lo que quieres hacer, es necesario refrescar el picturebox, ya que el mismo tiene dibujada una imagen. Dicha imagen la cambias cuando presionas el click del segundo botón, pero el picturebox no se percata de los cambios ocurridos a dicha imagen. Aparenta que el picturebox pinta la imagen en un buffer, y la misma se actualiza cuando se refresca el mismo.

Quizás sea posible que puedas evitar el refrescar el picturebox si editas directamente sobre el bitmap del picturebox, usando los métodos SetPixel y GetPixel del objeto Bitmap, pero creo que va a resultar en más líneas de código, y no es seguro que funcione.. nunca lo he probado

Espero haberte dado alguna idea de lo que puedes hacer

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Lo que todos necesitamos

Publicado por Ricardo Martínez (6 intervenciones) el 21/07/2004 17:06:33
Hola a todos,

Sinceramente no me imagino dibujando, por ejemplo, una curva de Bézier a partir de SetPixel y GetPixel.

Con la ayuda de todos este tema quedará resuelto y todos ganaremos. ¿por qué?, no más métodos ineficientes en el evento Paint.

Sólo imagínense hacer un programa como MS Paint, donde se dibujan las curvas que el usuario hace con los movimientos del mouse. Ahora, traten de "redibujar" eso en el evento Paint. ¡Por Dios!, ¡tendrán que guardar TODOS las curvas del usuario de alguna forma (Paths, Curves)..

Adjuntaría un programa de ejemplo, pero no veo dónde adjuntar archivos aquñi, y no creo que se pueda hacer.

La respuesta a este tema es lo que todos necesitamos.

¡Por favor respondan a este mensaje!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Lo que todos necesitamos

Publicado por Hernan* (58 intervenciones) el 04/08/2004 18:05:24
Me enviarias ese programa?
Gracias.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar