Pintar el fondo de un Formulario con un color degradado

Descripción general

Este documento contiene un ejemplo de código que muestra como se puede dibujar un color de fondo degradado en un formulario normal

[TOC] Tabla de Contenidos


↑↑↑

Pintar el fondo de un Formulario con un color degradado


↑↑↑

Imagen de ejemplo

A continuación se muestra una imagen de un formulario normal de Windows con el fondo de un color degradado, tal y como se genera con el código que se describe en este documento

Ejemplo que se obtiene con el código que se muestra en este documento

↑↑↑

Comentarios sobre el código

Para dibujar un degradado en el fondo del formulario necesitamos definir el área de dibujo (en este caso el fondo del formulario) y el degradado

La parte más destacable es la función que pinta el fondo [Ver PintarFondo]. Observa que utiliza un evento System.Windows.Forms.PaintEventArgs, [Ver PaintEventArgs]del que obtiene dos cosas fundamentales, el objeto [Graphics] para dibujar el degradado y el tamaño del formulario. [Ver Rectangle]

En realidad un objeto [Graphics ] se puede instanciar directamente,

' Graphics esta disponible en el parámetro e de [PaintEventArgs]

Dim gf As Graphics

Pero si lo hacemos hay dos inconvenientes, el primero es que estamos instanciando un objeto [Graphics ], con el tiempo que eso conlleva, si que haga falta porque en el evento [PaintEventArgs] hay disponible un objeto Graphics ya instanciado.

e.Graphics

Y por otra parte, las normas de MSDN, dicen que si se instancia un objeto [Graphics ] hay que llamar explícitamente a su objeto dispose cuando ya no se necesite.

El otro valor que necesitamos es el tamaño del rectángulo [Ver Rectangle] que vamos a dibujar, que coincide con el tamaño del formulario, por eso podríamos definir un rectángulo de la siguiente manera:

Dim rectangulo As Rectangle = New Rectangle(0, 0, Me.Width, Me.Height)

Pero ese valor ya está disponible en el evento [PaintEventArgs] por lo que no hace falta instanciarlo sino únicamente usarlo

Dim rectangulo As Rectangle = e.ClipRectangle

Por último queda por definir la brocha [Ver Brush] con el degradado para pintar con ella el fondo, y eso se hace con el objeto [LinearGradientBrush]

Si observas, un poco el código, veras que la función se llama desde el evento [Paint] del formulario y se le pasa un evento [PaintEventArgs] directamente, sin embargo, desde el evento [Resize], tenemos que instanciar un evento [PaintEventArgs], porque desde [Resize] no se dispone de ese evento.

La ventaja de este enfoque es que el proceso de pintado del fondo se llama muchas más veces desde el evento [Paint] que desde el evento [Resize] con lo que el código, se puede considerar que, esta optimizado.

El evento [Resize], se programa porque el dibujo del fondo no se realiza bien cundo se cambia el tamaño del formulario, quedando el degradado como a *capas*. Obligando a dibujarse el fondo cada vez que cambia el tamaño del formulario se resuelve el problema.

Un último detalle…. La función [PintarFondo] en realidad no es necesaria, todo ese código debe estar dentro del evento Paint, pero lo he puesto separado y he creado las variables internas de la función que contienen los colores, pensando en hacerla más fácil de modificar y porque creo que así el código esta mucho más claro.


↑↑↑

El codigo

#Region "Degradado de fondo para un formulario Normal"


    ''' <summary>
    '''  Capturar el evento Paint del Formulario, 
    '''  para obligarle a dibujar el degradado
    ''' </summary>
    Private Sub Form1_Paint( _
                ByVal sender As Object, _
                ByVal e As System.Windows.Forms.PaintEventArgs) _
            Handles Me.Paint

        Call PintarFondo(e)
    End Sub


    ''' <summary>
    '''  Capturar el evento Resize del Form
    ''' </summary>
    ''' <remarks>  
    '''  <para>
    '''    Resuelve el problema de redibujar el fondo
    '''    cuando se cambia el tamaño del formulario
    ''' </para> 
    '''  <para>
    '''    Cuando se cambia el tamaño del formulario, el fondo 
    '''    tiene problemas para dibujarse y se queda como a "capas".
    '''    Con este evento forzamos a que se dibuje totalmente 
    '''    y se resuelve el problema
    ''' </para> 
    ''' </remarks>
    Private Sub Form1_Resize( _
            ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Resize

        '-----------------------------
        'Crear el objeto [PaintEventArgs] que contiene la 
        'información necesaria para dibujar el fondo del formulario
        'El objeto [Graphics] y el rectángulo donde se 
        'dibujara el degradado, que corresponde con el tamaño 
        'actual del formulario
        '-----------------------------
        Dim eventoPaint As New PaintEventArgs( _
             Me.CreateGraphics, _
             New Rectangle(0, 0, Me.Width, Me.Height))

        '-----------------------------
        'llamar al evento [Paint] que dibuja el fondo
        'El evento [Paint] llama a la función [PintarFondo] que es la que 
        'realmente dibuja el fondo, por lo que también podíamos llamarla 
        'directamente, pero así queda como más bonito -y profesional :-) -
        '  Call PintarFondo(eventoPaint)
        '----------------------------
        OnPaint(eventoPaint)

    End Sub




    ''' <summary>
    '''  Funcion que pinta el fondo del formulario con un color degradado
    ''' </summary>
    ''' <param name="e">
    '''  Evento <see cref="System.Windows.Forms.PaintEventArgs">
    '''  PaintEventArgs</see> 
    '''  </param>
    ''' <remarks>
    '''  Del Evento <see cref="System.Windows.Forms.PaintEventArgs">
    '''  PaintEventArgs</see> se obtiene el objeto 
    '''  <see cref="System.Windows.Forms.PaintEventArgs.Graphics">
    '''  Graphics</see> para dibujar y el objeto 
    '''  <see cref="System.Windows.Forms.PaintEventArgs.ClipRectangle">
    '''   e.ClipRectangle</see> 
    '''  con el rectangulo que se dibujara (que es el fondo del formulario)
    ''' </remarks>
    Private Shared Sub PintarFondo(ByVal e As System.Windows.Forms.PaintEventArgs)

        '-----------------------------------------------------------------------------------
        ' Código original que inspira este codigo
        ' http://tips4csharp.blogspot.com/2007/11/crear-un-degradado-como-color-de-fondo.html
        ' http://msdn.microsoft.com/es-es/library/ms229655(v=vs.80).aspx
        '-----------------------------------------------------------------------------------

        '--------------------------
        ' Colores para el degradado 
        '  Color.Blue
        Dim COLOR_INICIO As Drawing.Color = Color.CadetBlue
        '  Color.Black ' Color.OldLace  
        Dim COLOR_FINAL As Drawing.Color = Color.CornflowerBlue


        '--------------------------
        'Primero.: Tendremos que usar de un objeto Graphics 
        ' para realizar el dibujo
        ' disponemos de uno en el  en el parámetro [e] 
        ' de [PaintEventArgs] Ver[e.Graphics]
        '--------------------------
        'Segundo.: El área de dibujo (área que vamos a rellenar)
        ' en nuestro caso todo el formulario
        ' el rectángulo que se va a pintar podemos generarlo a mano
        '' Dim rectangulo As New Rectangle(0, 0, Me.Width, Me.Height)
        ' o podemos obtenerlo del parámetro [PaintEventArgs] 
        ' que es lo que hacemos
        Dim rectangulo As Rectangle = e.ClipRectangle
        '--------------------------
        'Tercero.: La brocha
        ' Para crear el degradado hace falta un LinearGradientBrush.  
        ' En él se indica el área que se va a rellenar,  
        ' los colores del degradado y el tipo.
        ' El valor LinearGradientMode.Vertical significa que 
        ' el color degradado  va de arriba a abajo.
        Dim brocha As New LinearGradientBrush( _
                          rectangulo, _
                          COLOR_INICIO, _
                          COLOR_FINAL, _
                          LinearGradientMode.Vertical)
        '--------------------------
        'Cuarto.: Pintar el fondo del area de dibujo 
        '(en este caso del formulario)
        ' usando el objeto Graphics del parámetro 
        '[e] de [PaintEventArgs] Ver[e.Graphics]
        e.Graphics.FillRectangle(brocha, rectangulo)

    End Sub

#End Region

↑↑↑

A.1.Referencias

Brush
Brush (Clase)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Define los objetos que se utilizan para rellenar formas de gráficos, por ejemplo rectángulos, elipses, gráficos circulares y rutas.
  • URL del enlace: http://msdn.microsoft.com/es-es/library/d78x2d7s.aspx
Graphics
Graphics (Clase)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Encapsula una superficie de dibujo de GDI+. No se puede heredar esta clase.
  • URL del enlace: http://msdn.microsoft.com/es-es/library/ac148eb3.aspx
LinearGradientBrush
LinearGradientBrush (Clase)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Encapsula un Brush con un degradado lineal. No se puede heredar esta clase
  • URL del enlace: http://msdn.microsoft.com/es-es/library/k1x56d3y.aspx
OnPaint
Control.OnPaint
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Provoca el evento Paint.
  • URL del enlace: http://msdn.microsoft.com/es-es/library/21z9fct2.aspx
Paint
Control.Paint (Evento)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Se produce cuando vuelve a dibujarse el control
  • URL del enlace: http://msdn.microsoft.com/es-es/library/02745s21.aspx
PaintEventArgs
PaintEventArgs (Clase)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Proporciona datos al evento Paint
  • URL del enlace: http://msdn.microsoft.com/es-es/library/1yfbfys7.aspx
Rectangle
Rectangle (Estructura)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Almacena un conjunto de cuatro enteros que representan la posición y el tamaño de un rectángulo.
  • URL del enlace: http://msdn.microsoft.com/es-es/library/1zk39146.aspx
Resize
Control.Resize (Evento)
  • Información del documento:
    • Fecha.: [0000-00-00]
    • Resumen.: Se produce cuando se cambia el tamaño del control.
  • URL del enlace: http://msdn.microsoft.com/es-es/library/3y85ytf2.aspx

↑↑↑

A.2.Enlaces

[Para saber mas]
[Grupo de documentos]
[Documento Index]
[Documento Start]
[Imprimir el Documento]
© 1997 - - La Güeb de Joaquín
Joaquín Medina Serrano
Ésta página es española

Codificación
Fecha de creación
Última actualización