Imagen de fondo para un formulario.

26/04/2005 - 22:10 por LMCR | Informe spam
Saludos a todo el mundo:

Tengo una duda. ¿Cómo puedo dibujar una imagen de fondo en un formulario
"Windows Form" que sea "contenedor MDI"? (Supongo que dará igual que sea
MDI o no... pero por si acaso lo indico.)

Vale, la pregunta tiene truco. La propiedad "BackgroundImage" hace
eso... pero es que quiero que ajuste el tamaño de la imagen al tamaño
del área cliente del formulario MDI.

Más, he probado con poner un "PictureBox" y establecer la propiedad
"SizeMode" en "StretchImage" para que haga lo que quiero. Pues ahora me
enfrento a la curiosidad de que dicho "PictureBox" se queda siempre por
encima de todos los controles (una barra de herramientas) del formulario
MDI (esto no es grave, le pones "Dock" a "Complete" y se arregla) y,
además, de TODOS los formularios hijos (de ahí que insistiera en el
hecho de ser MDI). Es un efecto muy curioso, desde luego, pero que jode
(y perdón por la expresión) toda la utilidad del mismo.

He probado el método SendToBack() del control "PictureBox" y lo que
sucede es que éste desaparece y, por tanto, no muestra la imagen.

¿Alguien sabé qué hay que hacer? ¿No hay nada similar a Form.Stretch de
Visual FoxPro?


Muchas gracias.


LMCR.

Preguntas similare

Leer las respuestas

#1 Carlos Gómez
27/04/2005 - 06:55 | Informe spam
Si que es curioso.
Puedes probar para cada uno de los controles del formulario hijo ponerlos
delante:

dim ControlAux as Control
for each ControlAux in FormularioHijo
ControlAux.BringToFront
end for
...

otra posible cosa a probar es crear un picturebox en cada uno de los hijos y
colocarles el fondo que quieres. Es cutre pero a veces no queda más remedio
que hacer porquerías.

"LMCR" escribió en el mensaje
news:
Saludos a todo el mundo:

Tengo una duda. ¿Cómo puedo dibujar una imagen de fondo en un formulario
"Windows Form" que sea "contenedor MDI"? (Supongo que dará igual que sea
MDI o no... pero por si acaso lo indico.)

Vale, la pregunta tiene truco. La propiedad "BackgroundImage" hace
eso... pero es que quiero que ajuste el tamaño de la imagen al tamaño
del área cliente del formulario MDI.

Más, he probado con poner un "PictureBox" y establecer la propiedad
"SizeMode" en "StretchImage" para que haga lo que quiero. Pues ahora me
enfrento a la curiosidad de que dicho "PictureBox" se queda siempre por
encima de todos los controles (una barra de herramientas) del formulario
MDI (esto no es grave, le pones "Dock" a "Complete" y se arregla) y,
además, de TODOS los formularios hijos (de ahí que insistiera en el
hecho de ser MDI). Es un efecto muy curioso, desde luego, pero que jode
(y perdón por la expresión) toda la utilidad del mismo.

He probado el método SendToBack() del control "PictureBox" y lo que
sucede es que éste desaparece y, por tanto, no muestra la imagen.

¿Alguien sabé qué hay que hacer? ¿No hay nada similar a Form.Stretch de
Visual FoxPro?


Muchas gracias.


LMCR.


Respuesta Responder a este mensaje
#2 José Ramón
27/04/2005 - 11:36 | Informe spam
Es algo más complejo que todo eso. El contenedor MDI de un formulario es un
control
indendiente. Observa esté código, en el capturamos la referencia del control
MDI,
para luego dibujar sobre el una imagen contenida en un archivo, en este caso
centrada,
pero puedes hacer que ocupe todo el espacio.
También se maneja el evento Resize del formulario para ajustar la imagen
cuando cambia el tamaño.
Espero que te sirva

'Variable global en el formulario MDI
Public ctlMDI As MdiClient



Private Sub TfrmMain_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim ctl As Control



For Each ctl In Me.Controls

Try

ctlMDI = CType(ctl, MdiClient)

AddHandler ctlMDI.Paint, AddressOf PintarFondo

Catch exc As InvalidCastException

End Try

Next

Me.RecuperaConfiguracion()

End Sub

Private Sub PintarFondo(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs)

Dim Archivo As String = ".\Graficos\LogoFondo.gif"

If Me.ctlMDI.Height > 0 And Me.ctlMDI.Width > 0 Then

If File.Exists(Archivo) = True Then

Dim Imagen As Image = Image.FromFile(Archivo)

e.Graphics.DrawImage(Imagen, (ctlMDI.Width - Imagen.Width - 10) \ 2,
(ctlMDI.Height - Imagen.Height - 10) \ 2)

End If

End If

End Sub

Private Sub TfrmMain_Resize(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Resize

If Not (Me.ctlMDI Is Nothing) Then

Me.PintarFondo(Me.ctlMDI, New PaintEventArgs(Me.ctlMDI.CreateGraphics, New
Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size)))

End If

End Sub
Respuesta Responder a este mensaje
#3 LMCR
27/04/2005 - 14:19 | Informe spam
OK, muchísimas gracias.

Aún no lo he probado, pero no creo que ofrezca problemas tu solución.

De todas formas, indicar que la documentación oficial indica que la
clase System.Windows.Forms.MdiClient no debería usarse directamente a
partir de código. Está claro que el .NET Framework aún necesita de
ciertos retoques para llegar al nivel (ya no digamos superar) que
teníamos en VB6 (del cual aún me declaro fanático).


Un saludo.

LMCR.





"José Ramón" escribió en el mensaje
news:
Es algo más complejo que todo eso. El contenedor MDI de un formulario


es un
control
indendiente. Observa esté código, en el capturamos la referencia del


control
MDI,
para luego dibujar sobre el una imagen contenida en un archivo, en


este caso
centrada,
pero puedes hacer que ocupe todo el espacio.
También se maneja el evento Resize del formulario para ajustar la


imagen
cuando cambia el tamaño.
Espero que te sirva

'Variable global en el formulario MDI
Public ctlMDI As MdiClient



Private Sub TfrmMain_Load(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Load

Dim ctl As Control



For Each ctl In Me.Controls

Try

ctlMDI = CType(ctl, MdiClient)

AddHandler ctlMDI.Paint, AddressOf PintarFondo

Catch exc As InvalidCastException

End Try

Next

Me.RecuperaConfiguracion()

End Sub

Private Sub PintarFondo(ByVal sender As Object, ByVal e As
System.Windows.Forms.PaintEventArgs)

Dim Archivo As String = ".\Graficos\LogoFondo.gif"

If Me.ctlMDI.Height > 0 And Me.ctlMDI.Width > 0 Then

If File.Exists(Archivo) = True Then

Dim Imagen As Image = Image.FromFile(Archivo)

e.Graphics.DrawImage(Imagen, (ctlMDI.Width - Imagen.Width - 10) \ 2,
(ctlMDI.Height - Imagen.Height - 10) \ 2)

End If

End If

End Sub

Private Sub TfrmMain_Resize(ByVal sender As Object, ByVal e As
System.EventArgs) Handles MyBase.Resize

If Not (Me.ctlMDI Is Nothing) Then

Me.PintarFondo(Me.ctlMDI, New PaintEventArgs(Me.ctlMDI.CreateGraphics,


New
Rectangle(Me.ctlMDI.Location, Me.ctlMDI.Size)))

End If

End Sub





Respuesta Responder a este mensaje
#4 José Ramón
27/04/2005 - 16:54 | Informe spam
Me alegro de que te pueda servir.

Con respecto a la documentación oficial, no
la he leido, pero el código que te he dado, en
particular lo del MDIClient, está sacado directamente
de las páginas de Microsoft.

En cuanto a lo de VB6 yo no estoy de acuerdo,
creo que .NET Framework lo supera ampliamente
desde el principio, yo me declaro fanático de .NET,
desde que existe soy más feliz, porque puedo hacer
facilmente cosas que antes eran muy tediosas con VB6.


Un saludo.
Respuesta Responder a este mensaje
#5 Tristan
03/05/2005 - 21:04 | Informe spam
Totalmente de acuerdo. Para mi, comparar vb.net con vb6 es como comparar un
ferrari con una motocicleta. Me gustó VB en los primeros tiempos, hasta que
apareció Delphi, desde entonces siempre consideré VB un entorno de
desarrollo de juguete. Afortunadamente las cosas cambiaron tanto con .Net
que me convertí en fanático de este y abandoné completamente Delphi. Eso si,
creo que c# es ligeramente un mejor lenguaje que vb.net, aunque hay que
reconocer que la diferencia es pequeña.

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