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 MdiClientPrivate 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.ControlsTry
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 PintarFondoCatch 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