(魏滔序原创,转帖请注明出处。)
Imports System Imports System.Drawing Imports System.Drawing.Imaging Imports System.Windows.Forms Imports System.Runtime.InteropServices #Region "Win32 Class" Friend Class Win32 #Region "常量" Public Const ULW_COLORKEY As Int32 = &H1 Public Const ULW_ALPHA As Int32 = &H2 Public Const ULW_OPAQUE As Int32 = &H4 Public Const WS_EX_LAYERED As Int32 = &H80000 Public Const AC_SRC_OVER As Byte = &H0 Public Const AC_SRC_ALPHA As Byte = &H1 #End Region #Region "枚举" Public Enum Bool [False] = 0 [True] End Enum #End Region #Region "结构" <StructLayout(LayoutKind.Sequential,Pack:=1)> _ Private Structure ARGB Public Blue As Byte Public Green As Byte Public Red As Byte Public Alpha As Byte End Structure <StructLayout(LayoutKind.Sequential)> _ Public Structure Size Public cx As Int32 Public cy As Int32 Public Sub New(ByVal cx As Int32,ByVal cy As Int32) Me.cx = cx Me.cy = cy End Sub End Structure <StructLayout(LayoutKind.Sequential)> _ Public Structure Point Public x As Int32 Public y As Int32 Public Sub New(ByVal x As Int32,ByVal y As Int32) Me.x = x Me.y = y End Sub End Structure <StructLayout(LayoutKind.Sequential,Pack:=1)> _ Public Structure BLENDFUNCTION Public BlendOp As Byte Public BlendFlags As Byte Public SourceConstantAlpha As Byte Public AlphaFormat As Byte End Structure #End Region #Region "API" '该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。 Public Declare Auto Function GetDC Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr '该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。通过GetDc()获取的HDC直接与相关设备沟通,而本函数创建的DC,则是与内存中的一个表面相关联。 Public Declare Auto Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hDC As IntPtr) As IntPtr '该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。 Public Declare Auto Function SelectObject Lib "gdi32.dll" (ByVal hDC As IntPtr,ByVal hObject As IntPtr) As IntPtr '该函数更新一个分层的窗口的位置,大小,形状,内容和半透明度。 Public Declare Auto Function UpdateLayeredWindow Lib "user32.dll" (ByVal hwnd As IntPtr,ByVal hdcDst As IntPtr,ByRef pptDst As Point,ByRef psize As Size,ByVal hdcSrc As IntPtr,ByRef pprSrc As Point,ByVal crKey As Int32,ByRef pblend As BLENDFUNCTION,ByVal dwFlags As Int32) As Bool '该函数释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。它只释放公用的和设备上下文环境,对于类或私有的则无效。 Public Declare Auto Function ReleaseDC Lib "user32.dll" (ByVal hWnd As IntPtr,ByVal hDC As IntPtr) As Integer '该函数删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。 Public Declare Auto Function DeleteObject Lib "gdi32.dll" (ByVal hObject As IntPtr) As Bool '该函数删除指定的设备上下文环境(DC)。 Public Declare Auto Function DeleteDC Lib "gdi32.dll" (ByVal hdc As IntPtr) As Bool #End Region End Class #End Region Public Class AlphaForm Inherits Form Public Sub SetBitmap(ByVal opacity As Byte) Dim bmp As Bitmap = Me.BackgroundImage If bmp.PixelFormat <> PixelFormat.Format32bppArgb Then Throw New ApplicationException("窗体背景必须使用带Alpha通道的32位图片。") End If '根据图片大小设置窗体大小 Me.Size = bmp.Size '在内存中创建与当前屏幕兼容的DC Dim hDC1 As IntPtr = Win32.GetDC(IntPtr.Zero) Dim hDC2 As IntPtr = Win32.CreateCompatibleDC(hDC1) Dim hBitmap1 As IntPtr = IntPtr.Zero Dim hBitmap2 As IntPtr = IntPtr.Zero Try hBitmap1 = bmp.GetHbitmap(Color.FromArgb(0)) hBitmap2 = Win32.SelectObject(hDC2,hBitmap1) Dim blend As New Win32.BLENDFUNCTION() With blend .BlendOp = Win32.AC_SRC_OVER .BlendFlags = 0 .AlphaFormat = Win32.AC_SRC_ALPHA .SourceConstantAlpha = opacity End With Call Win32.UpdateLayeredWindow(Me.Handle,hDC1,New Win32.Point(Left,Top),New Win32.Size(bmp.Width,bmp.Height),hDC2,New Win32.Point(0,0),blend,Win32.ULW_ALPHA) Finally Call Win32.ReleaseDC(IntPtr.Zero,hDC1) If hBitmap1 <> IntPtr.Zero Then Call Win32.SelectObject(hDC2,hBitmap2) Call Win32.DeleteObject(hBitmap1) End If Call Win32.DeleteDC(hDC2) End Try End Sub Protected Overloads Overrides ReadOnly Property CreateParams() As CreateParams Get If Not DesignMode Then Dim cp As CreateParams = MyBase.CreateParams cp.ExStyle = cp.ExStyle Or Win32.WS_EX_LAYERED Return cp Else Return MyBase.CreateParams End If End Get End Property End Class
(魏滔序原创,转帖请注明出处。)
使用方法很简单:
1、新建窗体;
2、新建的窗体继承AlphaForm;
3、设置该窗体的背景图片位32为图像,bmp和png均可;
4、调用SetBitmap,传入透明度;
5、运行后即可看到效果。
原文链接:https://www.f2er.com/vb/260283.html