Programación General > Visual Basic 6.0 e inferiores
Transpariencia a los formularios
Jimbenit:
Ya se que muchos saben aplicar la transparencia a los formularios, pero se han preguntado si todos saben?
Bueno, para los que no saben aqui les dejo la oportunidad para que la apliquen a sus proyectos...
Copia el siguiente codigo en un modulo standar:
--- Código: Text ---'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NOV 6 / 2007'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@ @@@@'@@@ ESTE MODULO SIRVE PARA DAR TRASPARIENCIA A FORMULARIOS @@@@'@@@ @@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Option Explicit 'Declaración del Api SetLayeredWindowAttributes que establece _ la transparencia al form Private Declare Function SetLayeredWindowAttributes Lib "user32" _ (ByVal hWnd As Long, _ ByVal crKey As Long, _ ByVal bAlpha As Byte, _ ByVal dwFlags As Long) As Long 'Recupera el estilo de la ventanaPrivate Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hWnd As Long, _ ByVal nIndex As Long) As Long 'Declaración del Api SetWindowLong necesaria para aplicar un estilo _ al form antes de usar el Api SetLayeredWindowAttributes Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hWnd As Long, _ ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Private Const GWL_EXSTYLE = (-20)Private Const LWA_ALPHA = &H2Private Const WS_EX_LAYERED = &H80000'Función para saber si formulario ya es transparente. _ Se le pasa el Hwnd del formulario en cuestión Public Function Is_Transparent(ByVal hWnd As Long) As BooleanOn Error Resume Next Dim Msg As Long Msg = GetWindowLong(hWnd, GWL_EXSTYLE) If (Msg And WS_EX_LAYERED) = WS_EX_LAYERED Then Is_Transparent = True Else Is_Transparent = False End If If Err Then Is_Transparent = False End If End Function 'Función que aplica la transparencia, se le pasa el hwnd del form y un valor de 0 a 255Public Function Aplicar_Transparencia(ByVal hWnd As Long, _ Valor As Integer) As Long Dim Msg As Long On Error Resume Next If Valor < 0 Or Valor > 255 Then Aplicar_Transparencia = 1Else Msg = GetWindowLong(hWnd, GWL_EXSTYLE) Msg = Msg Or WS_EX_LAYERED SetWindowLong hWnd, GWL_EXSTYLE, Msg 'Establece la transparencia SetLayeredWindowAttributes hWnd, 0, Valor, LWA_ALPHA Aplicar_Transparencia = 0 End If If Err Then Aplicar_Transparencia = 2End If End Function '@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@ @@@@@@@@@'@@@@@@@ AHORA DEBES COLOCAR EN EL FORMULARIO, @@@@@@@@@'@@@@@@@ EN EL EVENTO "LOAD" LA SIGUIENTE INSTRUCCIÓN : @@@@@@@@@'@@@@@@@ Call Aplicar_Transparencia(Me.hWnd, 150) @@@@@@@@@'@@@@@@@ @@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@'@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
por ultimo, en el evento Form_load , llama este procedimiento:
Call Aplicar_Transparencia(Me.hWnd, 150)
siendo 150 el nivel de trasparencia, el nivel minimo es 0 (es decir, el formulario es completamente invisible)
el valor maximo es 255 (es decir, el formulario no tiene nada de transparencia.
Espero que les sirva...
saludos.
cpmario:
Me sirve, gracias.
Es muy fácil de implementar en mis proyectos.
Me puedes indicar si funciona en Win98.
:good:
Jimbenit:
Bien, mira.. la funcion que hace la llamada de la api es original de de win xp, creo que no funcionará (aunque no he hecho la prueba) pero me gustaria que hicieras la prueba...
saludos
Nebire:
Otro código de ejemplo. Pongo el código y doy algunas explicaciones... y las diferencias con le código de nuestro amigo Nilson
--- Código: Visual Basic --- ' en un módulo ' declaraciones de APIPrivate Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongPublic Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long ' función que realizaPublic Sub SetTransparencia(elHwnd As Long, elColor As OLE_COLOR) Const G_E = &HFFEC Const W_E = &H80000 Const LW_KEY = &H1 SetWindowLong elHwnd, G_E, GetWindowLong(elHwnd, G_E) Or W_E SetLayeredWindowAttributes elHwnd, elColor, 0, LW_KEYEnd Sub ' en el formulario ' pongamos el backcolor del formulario en un color que raramente vayamos a usar, por ejemplo un color rosa.' y colocamos un picture de ejemplo, Probad a cambiar el color de fondo del picture, vereis que sólo se hará transparente las partes que coincidan con el color que declaramos....Private Sub Form_Load() Call SetTransparencia(Me.hwnd, Me.BackColor) Call SetTransparencia(picture1.hwnd, Me.BackColor) end sub
El código indicado por Nilson, establece transparencia por nivel, el que yo expongo, lo hace por color, quien decide que sea uno o lo otro es la constante que Nilson llama 'LWA_ALPHA' y yo 'LW_KEY', que es el parámetro dwFlags. Cuando el valor es 2 se aplica transparencia por grados y para ello se usa el parámetro bAlpha en cambio si usamos el valor 1 entonces la transparencia se realiza en base a un color, es decir todas las áreas que coincidan con ese color se harán transparente, lo cual es ideal para hacer formularios 'recortados', el color se pasa en el parámetro 'crKey'. Como se menciona en el código salvo que lo tengamos pensado explícitamente así, el color debe ser uno que no acostumbremos a usar nunca, para evitar que por descuido un objeto de nuestro formulario haya 'desaparecido'.
Si en dwFlags marcamos 2 para indicar tansparencia por grados y establecemos un color, crKey (el color) se ignora y no produce ningún error, del mismo modo si en dwFlags indicamos el valor 1, bAlpha (el grado de transparencia) igualmente se ignora, sea el valor que sea el que se ponga.
Jimbenit:
...Buen aporte Nebire...
Saludos.
Navegación
[#] Página Siguiente
Ir a la versión completa