Visual Basic Foro

Programación => Visual Basic 6 => Mensaje iniciado por: pedroesca en Agosto 26, 2011, 11:20:12 am

Título: Dibujar Gradiente (draw gradient)
Publicado por: pedroesca en Agosto 26, 2011, 11:20:12 am
Buenas y Santas: en este caso mi duda/consulta/pedido, es sobre programación gráfica, es decir, quiero dibujar (o pintar) un picturebox pero con el efecto gradiente, creo que no es para nada complicado, pero en la parte gráfica estoy un tanto desorientado.
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: YAcosta en Agosto 26, 2011, 01:04:42 pm
Te puede servir esto:

http://leandroascierto.com/foro/index.php?topic=150.msg656#msg656 (http://leandroascierto.com/foro/index.php?topic=150.msg656#msg656)

Nota: Lea, me percate de un pequeño inconveniente con el cambio de server, cuando googleas aparece la dirección del anterior server, al menos al darle clic te lleva al foro pero ya no te lleva al mismo post como antes pasaba. Supongo que no queda de otra hasta que se rankee el nuevo server.

(https://byfiles.storage.live.com/y1plHeVjxw5qNxou6z0IWY1buRUiu5psrRiXJmN7ZNeGYojb95Ke4qEo9Adh0nUce2V27shni-YVh0/Degradadl.JPG?psid=1)
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: E N T E R en Agosto 26, 2011, 01:10:55 pm

Nota: Lea, me percate de un pequeño inconveniente con el cambio de server, cuando googleas aparece la dirección del anterior server


(http://enterpy.net/upload06/archivossubidos/t2c6p_cache_google.jpg)

Es por que google siempre busca en su cache primero creo...
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: YAcosta en Agosto 26, 2011, 01:23:02 pm
Si lo se, a lo que me refiero es que por ahora los resultados que obtenga un navegante en google y lo direccione al post del foro de Lea pues no lo llevará, lo llevara al "portal" de entrada, esto podría hacer que se pierda la visita de algunos navegantes. En todo caso es un costo temporal que tendrá que asumir, nada grave.
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: ADONAIRAFA en Agosto 26, 2011, 05:19:47 pm
Saludos y Buenas tardes a todos !!!

Yvan, ENTER no pude entrar en el enlace, para buscar el código. Así que con el permiso de Lenandro y el de uds, voy contigo Pedro (digo esto, porque no sé si será el código que tiene Leandro o el de él es más eficiente, así que a riesgo coloco este):

Código: [Seleccionar]
Private Sub Form_Resize()
          Cls
          AutoRedraw = True
          DrawStyle = 6
          DrawMode = 13
          DrawWidth = 2
          ScaleMode = 3
          ScaleHeight = (256 * 2)
          For i = 0 To 255
                Line (0, Y)-(Width, Y + 2), RGB(0, 0, i), BF
                Y = Y + 2
          Next i
End Sub

En este código, se cambia el ScaleMode a 3 (Pixel), lo demás es el estilo de trazado DrawStyle, DrawMode, DrawWidth, ScaleHeight; A continuación se traza una línea con el método Line dentro de un Bucle (For-Next), en el parámetro del método, el color, usamos RGB, donde el correspondiente a "Red" y al "Green" lo dejamos con valor 0, el correspondiente a "Blue" el valor cambiará a medida que avance el bucle (Variable i).
En este ejemplo, te presentará un Form (también aplicable al PICTUREBOX) que irá degradando el color desde el negro hasta el azul. También la línea dibujada, irá ensanchando su grosor a medida que el bucle se vaya incrementando, hasta llenar tada el área cliente del Form (o PICTUREBOX).

Espero que te pueda servir del alguna ayuda.

Saludos a todos !!!
Manuel F. Borrego S. 8)
Barcelona, Venezuela.
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: YAcosta en Agosto 26, 2011, 05:37:55 pm
Hola Manuel. Este código tuyo es el mas sintético que he visto de los que encontré sobre ese tema, muy bueno y muy bien explicado. Felicitaciones.
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: ADONAIRAFA en Agosto 26, 2011, 05:56:45 pm
Gracias Hermano !!!

No es más que el producto de varias sesiones de darle y darle, de buscar en la web, de seguir experimentando, embarrandola (perdón, seguir experimentando, Je, Je, Je !!! ;D ;D ;D).

Bueno y resultó ese código, pero creo que se puede mejorar más todavía, así que a quien sepa de este menester, que por favor lo coloque en el post !!!

Saludos !!!
Manuel F. Borrego S. 8)
Venezuela.
Título: Re:Dibujar Gradiente (draw gradient)
Publicado por: Lolabyte en Agosto 26, 2011, 10:17:10 pm
Aqui encontre una clase
http://www.recursosvisualbasic.com.ar/htm/listado-api/api-57-formulario-degradado.htm (http://www.recursosvisualbasic.com.ar/htm/listado-api/api-57-formulario-degradado.htm)

En mis programas ocupo esto, debo haberlo sacado del apiviewer, ya no recuerdo ;D

Código: (vb6) [Seleccionar]
'////////////////////////////////////////////////////////////////////////////////////////
Private Type TRIVERTEX
    x As Long
    y As Long
    Red As Integer    'ushort value
    Green As Integer  'ushort value
    Blue As Integer   'ushort value
    Alpha As Integer  'ushort value
End Type

Private Type GRADIENT_RECT
    UpperLeft As Long
    LowerRight As Long
End Type

Private Declare Function GradientFillRect Lib "msimg32" Alias "GradientFill" (ByVal hdc As Long, pVertex As TRIVERTEX, ByVal dwNumVertex As Long, pMesh As GRADIENT_RECT, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
Private Declare Function GradientFill Lib "msimg32" (ByVal hdc As Long, pVertex As Any, ByVal dwNumVertex As Long, pMesh As Any, ByVal dwNumMesh As Long, ByVal dwMode As Long) As Long
Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal x1 As Long, ByVal y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Const GRADIENT_FILL_RECT_H As Long = 0
Private Const GRADIENT_FILL_RECT_V As Long = 1
'////////////////////////////////////////////////////////////////////////////////////////

Private Sub DrawGradient( _
            ByVal hdc As Long, _
            ByVal LeftX As Long, _
            ByVal TopY As Long, _
            ByVal RightX As Long, _
            ByVal BottomY As Long, _
            ByVal StartColor As Long, _
            ByVal EndColor As Long, _
            Optional ByVal bVertical As Boolean)

Dim udtVert(1) As TRIVERTEX
Dim udtGRect   As GRADIENT_RECT

With udtVert(0)
     .x = LeftX
     .y = TopY
     .Red = pvLongToSignedShort(CLng((StartColor And &HFF&) * 256))
     .Green = pvLongToSignedShort(CLng(((StartColor And &HFF00&) \ &H100&) * 256))
     .Blue = pvLongToSignedShort(CLng(((StartColor And &HFF0000) \ &H10000) * 256))
     .Alpha = 0&
End With

With udtVert(1)
     .x = RightX
     .y = BottomY
     .Red = pvLongToSignedShort(CLng((EndColor And &HFF&) * 256))
     .Green = pvLongToSignedShort(CLng(((EndColor And &HFF00&) \ &H100&) * 256))
     .Blue = pvLongToSignedShort(CLng(((EndColor And &HFF0000) \ &H10000) * 256))
     .Alpha = 0&
End With

With udtGRect
     .UpperLeft = 0
     .LowerRight = 1
End With

Call GradientFill(hdc, udtVert(0), 2, udtGRect, 1, _
                  IIf(Not bVertical, GRADIENT_FILL_RECT_H, GRADIENT_FILL_RECT_V))

End Sub


Private Function pvLongToSignedShort(ByVal Unsigned As Long) As Integer

If (Unsigned < 32768) Then
   pvLongToSignedShort = CInt(Unsigned)
Else
   pvLongToSignedShort = CInt(Unsigned - &H10000)
End If

End Function


No olvidar antes de usar poner el Scalemode=vbPixels y AutoRedraw=True