У меня есть следующий код для загрузки PNG с альфа-каналом в форму и изменение формы для соответствия альфа-каналу.Alpha transparent window form
Public Function applyAlphaForm(ByVal f As Form, ByVal bitmap As Bitmap, Optional ByVal opacity As Byte = 255) As Boolean
f.FormBorderStyle = FormBorderStyle.None
Dim style As Long
style = Win32.GetWindowLong(f.Handle, Win32.GWL_EXSTYLE)
If Not (style And Win32.WS_EX_LAYERED = Win32.WS_EX_LAYERED) Then
style = style Or Win32.WS_EX_LAYERED
Win32.SetWindowLong(f.Handle, Win32.GWL_EXSTYLE, style)
End If
Return SetBitmap(f, bitmap, opacity)
End Function
Public Function SetBitmap(ByVal f As Form, ByVal bitmap As Bitmap, ByVal opacity As Byte) As Boolean
f.Height = bitmap.Height
f.Width = bitmap.Width
If bitmap.PixelFormat <> PixelFormat.Format32bppArgb Then
f.BackgroundImage = bitmap
f.TransparencyKey = bitmap.GetPixel(0, 0)
Return True
End If
Dim screenDC As IntPtr = Win32.GetDC(IntPtr.Zero)
Dim memDC As IntPtr = Win32.CreateCompatibleDC(screenDC)
Dim hBitmap As IntPtr = IntPtr.Zero
Dim oldBitmap As IntPtr = IntPtr.Zero
Try
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0)) 'grab a GDI handle from this GDI+ bitmap
oldBitmap = Win32.SelectObject(memDC, hBitmap)
Dim size As Win32.Size = New Win32.Size(bitmap.Width, bitmap.Height)
Dim pointSource As Win32.Point = New Win32.Point(0, 0)
Dim topPos As Win32.Point = New Win32.Point(f.Left, f.Top)
Dim blend As Win32.BLENDFUNCTION = New Win32.BLENDFUNCTION()
blend.BlendOp = Win32.AC_SRC_OVER
blend.BlendFlags = 0
blend.SourceConstantAlpha = opacity
blend.AlphaFormat = Win32.AC_SRC_ALPHA
Win32.UpdateLayeredWindow(f.Handle, screenDC, topPos, size, memDC, pointSource, 0, blend, Win32.ULW_ALPHA)
Catch ex As Exception
Finally
Win32.ReleaseDC(IntPtr.Zero, screenDC)
If hBitmap <> IntPtr.Zero Then
Win32.SelectObject(memDC, oldBitmap)
Win32.DeleteObject(hBitmap)
End If
Win32.DeleteDC(memDC)
End Try
Return True
End Function
Приятный и легкий, но если я надену некоторый контроль (кнопка, текстовое поле ...) на форму, они исчезнут. Я гость, что UpdateLayeredWindow закрасит форму hDC, чтобы мы ничего не увидели за ней. Итак, как нарисовать контроль формы на форме? Я пытаюсь перебрать все элементы управления и визуализации в png bitmap перед вызовом api, но это будет статическое изображение.
Почему бы вам просто не преобразовать растровое изображение в 32bpp и не избавиться от этого кода? –
К сожалению! Я нашел решение: http://stackoverflow.com/questions/2979125/how-to-make-the-form-into-fully-transparent-32bit-alpha :( –
@Hans Passant: Я хочу полупрозрачные данные из PNG (некоторая область непрозрачности) ... –