Cómo usar VB para poner una imagen de forma transparente en Imagen y esperar en línea
Función pública TranBlt(DestHdc As Long, srcH opcional As Long, tc opcional As Long = -1, IsBmp opcional As Long) As Long
'El parámetro srcHdcOrBmp pasado puede ser hdc o el Handle del objeto Bmp,
'Cuando el parámetro IsBmp es verdadero, srcHdcOrBmp representa el Handle del objeto Bmp, y cuando es falso, representa hdc
' El valor devuelto devuelve un color transparente si tiene éxito y -1 si no tiene éxito
Dim tHdc (3) As MemHdc
Dim J As Long, oc As Long, I As Long, Bm Como BITMAP, cc Mientras, NewDc Mientras,
Dim sw Mientras, sh Mientras, sBmp Mientras, sHdc Mientras, obm Mientras, NewX Mientras, NewY Mientras
Si DestHdc = 0 O srcHdcOrBmp = 0 O W = 1 Y H = 1 Entonces GoTo falla
Si IsBmp Entonces 'Si se pasa el identificador Bmp, se debe crear un DC temporal para él
sBmp = srcHdcOrBmp
tHdc(3) = NewMyHdc(DestHdc, 0 , 0, srcHdcOrBmp)
sHdc = tHdc(3).hdc
De lo contrario
sHdc = srcHdcOrBmp
Si srcW = 0 Entonces sBmp = GetCurrentObject(sHdc, 7)
Finalizar si
Si sHdc = 0 o sBmp = 0, entonces GoTo falla
Si srcW = 0 Entonces 'Si no proporciona el tamaño de la imagen de origen, necesita obtener el tamaño completo de la imagen de origen
GetObj sBmp , Len(Bm), Bm
sw = Bm.bmWidth - srcX
sh = Bm.bmHeight - srcY
Más
sw = srcW
sh = srcH
Finalizar si
Si sw lt 1 o sh lt 1, entonces GoTo falla
>
Si tc = -1 Entonces
cc = GetPixel(sHdc, srcX, srcY) 'Usa el primer píxel en la esquina superior izquierda como color de fondo de la imagen de origen para transparencia
Else
cc = tc
Fin si
Si W lt;gt; sw O H lt;gt entonces
tHdc(2) = NewMyHdc(DestHdc, W, H)
StretchBlt tHdc(2).hdc, 0, 0, W, H, sHdc, srcX, srcY, sw, sh, vbSrcCopy
'Primero escale la imagen de origen y los siguientes pasos son los mismos.
NewDc = tHdc(2).hdc
Más
NewDc = sHdc
NewX = srcX
NewY = srcY
End If
BitBlt DestHdc, X, Y, W, H, NewDc, NewX, NewY, vbSrcInvert
'Invierte primero la imagen de origen El color (XOR) se dibuja en la imagen de destino. Si el fondo de la imagen de origen es negro, este paso se puede omitir
'El siguiente es el método para crear una imagen de máscara
tHdc(0) = NewMyHdc(DestHdc, 0, 0, I) 'Crea un nuevo DC para la imagen monocromática y selecciónela
p>tHdc(1) = NewMyHdc(DestHdc, W, H) 'Crea otra imagen en color y DC para almacenar la imagen de máscara
oc = SetBkColor (NewDc, cc) 'Cambiar la fuente Cambia el color de fondo de la imagen a transparente
BitBlt tHdc(0).hdc, 0, 0, W, H, NewDc, NewX, NewY, vbSrcCopy p>
'Primero dibuja la imagen de origen. Ingresa un DC de un solo color, lo que da como resultado una imagen de máscara con solo el frente y el reverso, el color de fondo (color transparente) es negro y los demás son blancos
SetBkColor NewDc, oc 'Restaura el color de fondo de la imagen de origen, lo cual no es necesario, pero es un buen hábito.
BitBlt tHdc(1).hdc, 0, 0, W, H, tHdc(0).hdc, 0, 0, vbSrcCopy
'DC monocromático debe copiarse en color DC puede realizar la operación AND posterior
'La imagen de la máscara está completa y se ha colocado el DC de color
BitBlt DestHdc, X, Y, W, H, tHdc(1). hdc , 0, 0, vbSrcAnd 'Dibujo transparente estándar: elige dibujar el mapa de máscara usando la operación And,
BitBlt DestHdc, X, Y, W, H, NewDc, NewX, NewY, vbSrcInvert 'Entonces agregue la fuente La imagen se dibuja una vez con color inverso (XOR)
DelMyHdc tHdc(0)
DelMyHdc tHdc(1)
Si tHdc(2) .hdc lt; gt; 0 Entonces DelMyHdc tHdc(2)
Si tHdc(3).hdc lt;gt 0 Entonces DelMyHdc tHdc(3)
TranBlt = cc p>
Función de salida
falla:
Si tHdc(3).hdc lt;gt 0 Entonces DelMyHdc tHdc(3)
TranBlt = -1 p>
Función final
Función privada NewMyHdc(dHdc As Long, W As Long, H As Long, Opcional Bm As Long) Como MemHdc
Con NewMyHdc
.hdc = CreateCompatibleDC(dHdc)
Si Bm = 0 Entonces
.Bmp = CreateCompatibleBitmap(dHdc, W, H)
De lo contrario
p>.Bmp = Bm
Finalizar si
.obm = SelectObject(.hdc, .Bmp)
Finalizar Con
Función final
Función privada DelMyHdc(MyHdc como MemHdc, nobmp opcional como booleano) Como MemHdc
Con MyHdc
Si . hdc lt; gt; 0 Y .obm lt;gt; 0 Luego SeleccionarObjeto .hdc, .obm
Si nobmp = False Y .Bmp lt;gt; > Si .hdc lt; gt; 0 entonces eliminarDC .hdc
Finalizar con
Función final
Pon esta función en un BAS, y luego en el formato
TranBlt pic.hdc, X, Y, W, H, PIC2.Picture.Handle, _
TX , TY, TW, TH, , Verdadero
OK