Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Insertar fotos transparentes

Estas en el tema de Insertar fotos transparentes en el foro de Visual Basic clásico en Foros del Web. Hola! Una pregunta, en un formulario estoy insertando una foto como logo de fondo y esta su fondo es transparente (la de la foto) pero ...
  #1 (permalink)  
Antiguo 16/03/2010, 05:18
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 1 mes
Puntos: 0
Insertar fotos transparentes

Hola!

Una pregunta, en un formulario estoy insertando una foto como logo de fondo y esta su fondo es transparente (la de la foto) pero cuando me la visualiza me la pone en fondo blanco, he probado con todos los formatos validos para insertar fotos y en todos me sale con fondo blanco, ¿Existe alguna manera de hacer que su fondo transparente se active y vea como tal igual que se hace con un texto?

Muchas gracias
  #2 (permalink)  
Antiguo 17/03/2010, 15:46
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Insertar fotos transparentes

He estado investigando y he conseguido hacerlo, pero aunque parece algo simple me ha costado un montón y el código es bastante extenso. Si tienes mucho empeño te lo paso por si te vale. Yo recorté unos trozos a una foto y he conseguido que se transparenten, pero igual con tu foto no sirve, ¿quien sabe?

Saludos

PD:

Lo he conseguido con menos código, aunque me ha costado.

El caso es que el código que encontré funcionaba, pero la imagen no se quedaba fija. Cuando minimizaba el form o ponía otra ventana delante, al volver a mostrarlo la imagen se había borrado.

Despues de mucho pensar he encontrado una solución que no conlleva meter otro tanto código, (que no es poco el que lleva), solo para fijar la imagen. Simplemente la repinto cuando hace falta.

En fín, este es el código:

Esto va en un módulo

Código vb:
Ver original
  1. Option Explicit
  2.  
  3. Dim hRgn As Long
  4.  
  5. Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
  6. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  7. Private Declare Function ReleaseCapture Lib "user32" () As Long
  8. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  9. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDC As Long) As Long
  10. Private Declare Function SelectObject Lib "gdi32" (ByVal hDC As Long, ByVal hObject As Long) As Long
  11. Private Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
  12. Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  13. Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
  14. Private Declare Function DeleteDC Lib "gdi32" (ByVal hDC As Long) As Long
  15. Private Declare Function GetPixel Lib "gdi32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long) As Long
  16.  
  17. Private Type BITMAP
  18.     bmType As Long
  19.     bmWidth As Long
  20.     bmHeight As Long
  21.     bmWidthBytes As Long
  22.     bmPlanes As Integer
  23.     bmBitsPixel As Integer
  24.     bmBits As Long
  25. End Type
  26.  
  27. Private Const WM_NCLBUTTONDOWN = &HA1
  28. Private Const HTCAPTION = 2
  29.  
  30. Private Sub SetRegion(ShapedObject As Object)
  31.   On Local Error Resume Next
  32.   If hRgn Then DeleteObject hRgn
  33.   hRgn = GetBitmapRegion(ShapedObject.Picture, vbWhite)
  34.   SetWindowRgn ShapedObject.hwnd, hRgn, True
  35. End Sub
  36.  
  37. Private Function GetBitmapRegion(cPicture As StdPicture, cTransparent As Long) As Long
  38.   Dim hRgn As Long, tRgn As Long
  39.   Dim x As Integer, y As Integer, X0 As Integer
  40.   Dim hDC As Long, BM As BITMAP
  41.   On Local Error Resume Next
  42.   hDC = CreateCompatibleDC(0)
  43.   If hDC Then
  44.     SelectObject hDC, cPicture
  45.     GetObject cPicture, Len(BM), BM
  46.     hRgn = CreateRectRgn(0, 0, BM.bmWidth, BM.bmHeight)
  47.     For y = 0 To BM.bmHeight
  48.       For x = 0 To BM.bmWidth
  49.         While x <= BM.bmWidth And GetPixel(hDC, x, y) <> cTransparent
  50.           x = x + 1
  51.         Wend
  52.         X0 = x
  53.         While x <= BM.bmWidth And GetPixel(hDC, x, y) = cTransparent
  54.           x = x + 1
  55.         Wend
  56.         If X0 < x Then
  57.           tRgn = CreateRectRgn(X0, y, x, y + 1)
  58.           CombineRgn hRgn, hRgn, tRgn, 4
  59.           DeleteObject tRgn
  60.         End If
  61.       Next x
  62.     Next y
  63.     GetBitmapRegion = hRgn
  64.     DeleteObject SelectObject(hDC, cPicture)
  65.   End If
  66.   DeleteDC hDC
  67. End Function
  68.  
  69. Sub CargaImagenTransp(Fichero As String, Picture As PictureBox)
  70.   On Local Error Resume Next
  71.   Picture.Visible = False
  72.   Picture.Picture = LoadPicture(Fichero)
  73.   SetRegion Picture
  74.   Picture.Visible = True
  75. End Sub
  76.  
  77. Sub RefrescaImagen(Fichero As String, Picture As PictureBox)
  78.   On Local Error Resume Next
  79.   Picture.Picture = LoadPicture(Fichero)
  80.   SetWindowRgn Picture.hwnd, hRgn, True
  81. End Sub

Y esto en el form.
Código vb:
Ver original
  1. Option Explicit
  2. Dim FicheroImagen As String
  3.  
  4. Private Sub Form_Load()
  5.   On Local Error Resume Next
  6.   Me.AutoRedraw = False
  7.   Picture1.AutoSize = True
  8.   FicheroImagen = App.Path & "\foto.jpg"
  9.   CargaImagenTransp FicheroImagen, Picture1
  10. End Sub
  11.  
  12. Private Sub Form_Paint()
  13.   RefrescaImagen FicheroImagen, Picture1
  14. End Sub

Solo hay que indicar en el Load la foto que quieres cargar.

Espero que a alguien le sirva. Yo me lo guardaré, aunque seguro que si un día lo necesito no lo encontraré.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!

Última edición por pkj; 18/03/2010 a las 01:37
  #3 (permalink)  
Antiguo 18/03/2010, 02:29
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años, 1 mes
Puntos: 0
Respuesta: Insertar fotos transparentes

Hola pkj!

Gracias por el curro que te has pegado no era necesario a ese nivel pero si como información, la verdad es que comentaba que era para poder insertar un logo de fondo transparente en un formulario, supongo que lo que has creado servira aunque con tanto codigo, casi vale la pena mejor el cambiarle el fondo del logo y ponerle el mismo que el del fornulario, pero aún asi muchas gracias de todo corazon.

Un saludo

Etiquetas: fotos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:00.