Trucos Gradiente entre dos colores (degradado)

Para hacer un gradiente (degradado) entre dos colores podemos usar la rutina que se presenta a continuación. Los parámetros que recibe son :
- objeto (formulario o picture con la propiedad autoredraw a true)
- color origen
- color destino
- tipo de gradiente (horizontal=0 , vertical =1 o diagonal =2)

En un formulario escribimos :

Option Explicit
Private Type RGBQUAD
        rgbBlue As Byte
        rgbGreen As Byte
        rgbRed As Byte
        rgbReserved As Byte
End Type
Private Enum TipoGradiente
    Horizontal = 0
    Vertical = 1
    Diagonal = 2
End Enum
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
  (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Declare Function LineTo Lib "gdi32" _
  (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function MoveToEx Lib "gdi32" _
  (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As Any) As Long
Private Declare Function DeleteObject Lib "gdi32" _
  (ByVal hObject As Long) As Long
Private Declare Function CreatePen Lib "gdi32" _
  (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
Private Declare Function SelectObject Lib "gdi32" _
  (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Const PS_SOLID = 0
Public Sub Gradiente(objeto As Object, lngColor1 As Long, lngColor2 As Long, Optional ByVal Tipo As Long = 0)
Dim rgbColor1 As RGBQUAD, rgbColor2 As RGBQUAD
Dim ColorRojo As Double, ColorVerde As Double, ColorAzul As Double
Dim CDiffRed As Double, CDiffGreen As Double, CDiffBlue As Double
Dim CFadeRed As Double, CFadeGreen As Double, CFadeBlue As Double
Dim Fade As Double
Dim hNewPen As Long, hOldPen As Long
Dim Escala As Long
Dim Tamaño As Double, Longitud As Double
On Error Resume Next
'Guardamos el tipo de escala original
Escala = objeto.ScaleMode
objeto.ScaleMode = vbPixels
Select Case Tipo
    Case Horizontal: Tamaño = objeto.ScaleWidth
                    Longitud = objeto.ScaleHeight
    Case Vertical: Tamaño = objeto.ScaleHeight
                    Longitud = objeto.ScaleWidth
    Case Diagonal: Tamaño = objeto.ScaleWidth
                    Longitud = objeto.ScaleHeight
End Select
'Obtenemos los valores rgb de los colores
Long2RGB lngColor1, rgbColor1
Long2RGB lngColor2, rgbColor2
'Calculamos las diferencias entre los colores
CDiffRed = -(CLng(rgbColor1.rgbRed) - CLng(rgbColor2.rgbRed))
CDiffGreen = -(CLng(rgbColor1.rgbGreen) - CLng(rgbColor2.rgbGreen))
CDiffBlue = -(CLng(rgbColor1.rgbBlue) - CLng(rgbColor2.rgbBlue))
'tomamos los colores iniciales
ColorRojo = rgbColor1.rgbRed: ColorVerde = rgbColor1.rgbGreen: ColorAzul = rgbColor1.rgbBlue
'Calculamos el incremento en los colores para cada línea
CFadeRed = CDiffRed / Tamaño
CFadeGreen = CDiffGreen / Tamaño
CFadeBlue = CDiffBlue / Tamaño
'Si es diagonal
If Tipo = Diagonal Then Tamaño = Tamaño + Longitud
'Pintamos las líneas
For Fade = 0 To Tamaño
    'Creamos un nuevo pen
    hNewPen = CreatePen(PS_SOLID, 0, RGB(ColorRojo, ColorVerde, ColorAzul))
    hOldPen = SelectObject(objeto.hdc, hNewPen)
    Select Case Tipo
        Case Horizontal: 'Nos colocamos en el origen de la línea
                        MoveToEx objeto.hdc, Fade, 0&, 0&
                        'Trazamos la línea
                        LineTo objeto.hdc, Fade, Longitud
        Case Vertical: 'Nos colocamos en el origen de la línea
                        MoveToEx objeto.hdc, 0&, Fade, 0&
                        'Trazamos la línea
                        LineTo objeto.hdc, Longitud, Fade
        Case Diagonal: 'Nos colocamos en el origen de la línea
                        MoveToEx objeto.hdc, Fade, 0&, 0&
                        'Trazamos la línea
                        LineTo objeto.hdc, 0&, Fade
    End Select
    'Restauramos el pen original
    hNewPen = SelectObject(objeto.hdc, hOldPen)
    'Borrarmos el pen
    DeleteObject hNewPen
    'Incrementamos los colores
    ColorRojo = ColorRojo + CFadeRed
    ColorVerde = ColorVerde + CFadeGreen
    ColorAzul = ColorAzul + CFadeBlue
Next Fade
objeto.Picture = objeto.Image
'Restablecemos el ScaleMode
objeto.ScaleMode = Escala
End Sub


Public Sub Long2RGB(lngColor As Long, rgbColor As RGBQUAD)
Dim aux As Byte
CopyMemory rgbColor, lngColor, 4
aux = rgbColor.rgbBlue
rgbColor.rgbBlue = rgbColor.rgbRed
rgbColor.rgbRed = aux
End Sub




Trucos Trucos

Visual Basic Página de Visual Basic

Página principal Página principal

www.jrubi.com