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

Preguntas similare

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#
Respuesta Responder a este mensaje
#2 Juan Pedro Gonzalez
07/07/2005 - 10:34 | Informe spam
Hola,

Personalmente considero que es mas "limpio", si se trata de pintar el fondo,
emplear el reemplazo: OnPaintBackground para las imagen de fondo. En este
caso el "graphics" no estaría en la 'e' sino en 'pevent'...

Por otro lado, si queremos que se redibuje al cambiar el tamaño podemos usar
el "SetStyle(ControlStyles.ResizeRedraw, True)"... y ya de paso el
"SetStyle("ControlStyles.DoubleBuffer)" para evitar posibles parpadeos. Si
lo que queremos es pintarlo a traves de los mensajes WM_PAINT lo mas
sencillo suele ser hacer un
"SetStyle(ControlStyles.AllPaintingInWmPaint,True)", de esta forma ingora el
WM_ERASEBKGND reduciendo el parpadeo que se produce al pintar el control
(Para que esto funcione también debemos fijar el
"SetStyle(ControlStyles.UserPaint,True)").

Saludos,

Juan Pedro González



"Tristan" escribió en el mensaje
news:
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#


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida