Color de fondo en un formulario MDI
Y pintar en el área cliente MDI

Fecha: 04/03/2004 (06/Mar/2004)
Autor: José Ramón Pastor Compañ  jrpc@ono.com

 


Cuando empecé con Visual Basic 6, siempre tenia la manía de cambiar el color de fondo de los formularios MDI y cuando ya sabia algo mas, les dibujaba degradados al estilo de los programas de instalación.
Cuando empecé con VB .NET me di cuenta de que el color de fondo de un formulario no se puede cambiar, siempre aparecía ese color "tosco" que no me gusta nada, así que investigando encontré un artículo en Microsoft que explicaba como cambiar el color de fondo. Yo lo he mejorado un poco y además de cambiar el color, creo degradados de fondo en el área cliente MDI.  

Para cambiar el color de fondo de un MDI añade el siguiente código en el evento load del formulario:

Nota: Necesitamos la variable global ctlMDI
Dim ctlMDI as MdiClient

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

Dim ctl As Control 

'Estamos buscando en control que representa el area cliente MDI 
For Each ctl In Me.Controls

Try

ctlMDI = CType(ctl, MdiClient)

 ' Asignamos el color de fondo
ctlMDI.BackColor = Color.AntiqueWhite

'Aquí asignamos el manejador para pintar el fondo con degradados o lo que
'queramos. Si solo queremos cambiar el color de fondo no hace falta, ni las funciones siguientes tampoco
 AddHandler ctlMDI.Paint, AddressOf PintarFondo

Catch ex As InvalidCastException

 End Try

Next

End Sub

Vale, ahora necesitamos la función que pinta el fondo del area cliente:

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

Dim GradientePanel As New LinearGradientBrush(New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height), Color.Blue, Color.Black,LinearGradientMode.Vertical)

 e.Graphics.FillRectangle(GradientePanel, New RectangleF(0, 0, ctlMDI.Width, ctlMDI.Height))

End Sub

Por último, es conveniente capturar el evento Resize del formulario.

Esto es así porque me he dado cuenta de que cuando se redimensiona el formulario no se pinta bien el degradado, así que si "capturamos" el evento y forzamos a que se repinte, todo irá bien. Este es el código.

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


ir al índice