Llevo tiempo intentando semitransparentar un picture o una sólo una parte de un formulario. A día de hoy no lo he conseguido. No me importa que sea con vb6 o vb.net
He hecho un poquito de trampa, para simular el efecto. Aquí dejo una muestra de lo que quiero. Pero repito, que sólo simula el efecto.
1 Formulario: Form1
1 Formulario: Form2 (establecer como BorderStyle=0)
1 PictureBox en Form1
1 PictureBox en Form2
1 Control Timer en el Form1: Timer1
En un MÓDULO:
Código
Option Explicit Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long 'Obtiene posición de una ventana u objeto Private Declare Function GetWindowRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT) As Long Private Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 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 = &H2 Private Const WS_EX_LAYERED = &H80000 Public Function CreateObjectTransparent(ByVal frmMain As Form, ByVal frmObj As Form, objPic As PictureBox, ByVal Alpha As Integer) Dim i frmObj.Show frmObj.ZOrder 1 Transparencia frmObj.hwnd, Alpha objPic.BackColor = &HFF00FF AnularColor frmMain.hwnd, &HFF00FF EnableWindow frmObj.hwnd, 0 End Function 'Función que aplica la transparencia, se le pasa el hwnd del form y un valor de 0 a 100 Public Function Transparencia(ByVal hwnd As Long, NivelTrans As Integer) As Long Dim X As Long On Error Resume Next NivelTrans = (NivelTrans * 255) / 100 X = GetWindowLong(hwnd, GWL_EXSTYLE) X = X Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, X 'Establece la transparencia SetLayeredWindowAttributes hwnd, 0, NivelTrans, LWA_ALPHA If Err Then Transparencia = 2 End If End Function 'Función que aplica la transparencia, se le pasa el hwnd del form y un valor de 0 a 255 Public Function AnularColor(ByVal hwnd As Long, Color As Long) As Long Dim X As Long On Error Resume Next X = GetWindowLong(hwnd, GWL_EXSTYLE) X = X Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, X 'Establece la transparencia SetLayeredWindowAttributes hwnd, Color, 0, &H1 AnularColor = 0 If Err Then AnularColor = 2 End If End Function Public Sub ResizeOjb(ByVal objPic As PictureBox, ByVal frmObj As Form) Dim r As RECT, s As RECT, N N = GetWindowRect(objPic.hwnd, r) frmObj.Move r.Left * 15 - 200, r.Top * 15 - 200, objPic.Width + 400, objPic.Height + 400 End Sub
En un FORMULARIO:
Código
Private Sub Form_Load() Form2.Picture1.BackColor = vbBlack CreateObjectTransparent Form1, Form2, Picture1, 50 End Sub Private Sub Form_Unload(Cancel As Integer) Unload Form2 End Sub Private Sub Timer1_Timer() ResizeOjb Picture1, Form2 End Sub
Lo que hago es transparentar completamente el Picture1 del Form1 y luego semitransparentar el Form2 que contiene otro Picture. Obtengo la posición del Picture1 del Form1 y muevo y redimiensiono el Form2 al Picture1 del Form1. Coloco el Form2 debajo del Form1 y de esta manera creo el efecto de semitransperancia tan solo en un parte del Form1. Ademas he agrandado un poco el Form2 con respecto al Picture1 del Form1 para que al mover el formulario no se formen huecos ya que al mover muy rápido no le da tiempo a recolocar el Form2, lo bastante como para que se vean huecos si se mueve demasaido rápido
Este método que he utilizado NO me permite interactuar con el PictureBox semitransparente. Si que es posible quitando "EnableWindow frmObj.hwnd, 0" pero entonces al hacer clic en el Picture del Form2, éste se coloca delante del Form1. Ya he probado Zorder. No sirve queda un poco chapucero.
Esto lo pongo como ejemplo pero no es lo que quiero. Lo ideal sería poder solo semitranspertentar una parte del Form o un Picture.
Saludos.
==============
Esto es una imagen que encontré googleando. Algo así me hiría de miedo. Como se ve en la imagen los controles no son transparentes pero el form sí.