background image

06/07/2005 - 20:42 por José Mª Toro Bermejo | Informe spam
hola a todos. estoy intentando dibujar una imagen como fondo de un
formulario mediante codigo:

dim imagen as new bitmap(ruta de la imagen)
dim grafics as system.graphics=me.creategraphics
grafics.drawimage(imagen,0,0,me.size.width,me.size.height)

la imagen me la dibuja pero inmediatamente me la borra ¿por que puede ser?
gracias de antemano
 

Leer las respuestas

#1 Tristan
06/07/2005 - 17:40 | Informe spam
Pues es debido a que esa no es la forma correcta de dibujar una imagen. He
visto en los foros que muchas personas utilizan CreateGraphics para dibujar,
y no entiendo por qué.

Te explico un poco. En windows, todo lo que veas sobre una ventana, se ha
pintado en el mensaje de WM_PAINT. Cuando una ventana se solapa bajo otra,
el contenido se tiene que pintar de nuevo al descubrirla. Para eso existe en
.net o en versiones anteriores de vb, el evento de Paint. Se produce cada
vez que el control tiene que ser redibujado. Todo lo que quieras que se
dibuje de forma permanente, se debe pintar en el evento de Paint.

Por otro lado, en versiones anteriores de VB las cosas eran exactamente
igual, PERO los controles dibujables tenían una propiedad, AutoRedraw, que
el Paint lo haga el propio VB. Para ello se mantiene un buffer con lo
dibujado que luego se aplicará en Paint de forma transparente. Lógicamente
este buffer consume mucha memoria, por lo que suele ser recomendable
desactivarlo, especialmente para formularios de gran tamaño.

En .Net puedes trabajar de forma similar al Autoredraw = true, con la única
diferencia de que este buffer se debe crear de forma explícita:

dim imagen as new Bitmap(PictureBox1.Width, PictureBox1.Height)
dim lienzo as Graphics = Graphics.FromImage(imagen)
lienzo.Draw...
...
PictureBox1.Image = imagen


Observa que todos los controles .net tienen una propiedad BackgroundImage.
Podrías utilizar cualquier control, por ej. un Label.

Ahhh, y por si decides utilizar el evento de Paint, recuerda que este
obtiene un Graphics en su parámetro "e".

Juan Carlos Badiola
MVP - C#

Preguntas similares