| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 
 | Imports System.Runtime.InteropServices
 
 
Public Class Form2
    Public Sub New()
        InitializeComponent()
    End Sub
 
 
    Public Const WS_EX_LAYERED As Integer = &H80000
    Public Const AC_SRC_OVER As Integer = &H0
    Public Const AC_SRC_ALPHA As Integer = &H1
    Public Const ULW_ALPHA As Integer = &H2
 
 
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function UpdateLayeredWindow(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 Integer, ByRef pblend As BLENDFUNCTION, ByVal dwFlags As Integer) As Boolean
    End Function
    <DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function CreateCompatibleDC(ByVal hDC As IntPtr) As IntPtr
    End Function
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function GetDC(ByVal hWnd As IntPtr) As IntPtr
    End Function
    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
    End Function
    <DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function DeleteDC(ByVal hdc As IntPtr) As Boolean
    End Function
    <DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
    End Function
    <DllImport("gdi32.dll", CharSet:=CharSet.Auto, SetLastError:=True)>
    Public Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean
    End Function
 
 
 
 
    <StructLayout(LayoutKind.Sequential)>
    Public Structure BLENDFUNCTION
        Private Shared _BlendOp As Byte
        Private Shared _BlendFlags As Byte
        Private Shared _SourceConstantAlpha As Byte
        Private Shared _AlphaFormat As Byte
 
        Shared Sub New()
            _BlendOp = 0
            _BlendFlags = 0
            _SourceConstantAlpha = 0
            _AlphaFormat = 0
        End Sub
 
        Public Property BlendOp As Byte
            Get
                Return _BlendOp
            End Get
            Set(ByVal value As Byte)
                _BlendOp = value
            End Set
        End Property
 
        Public Property BlendFlags As Byte
            Get
                Return _BlendFlags
            End Get
            Set(ByVal value As Byte)
                _BlendFlags = value
            End Set
        End Property
 
        Public Property SourceConstantAlpha As Byte
            Get
                Return _SourceConstantAlpha
            End Get
            Set(ByVal value As Byte)
                _SourceConstantAlpha = value
            End Set
        End Property
 
        Public Property AlphaFormat As Byte
            Get
                Return _AlphaFormat
            End Get
            Set(ByVal value As Byte)
                _AlphaFormat = value
            End Set
        End Property
    End Structure
 
    Protected Overrides ReadOnly Property CreateParams As CreateParams
        Get
            Dim CP As CreateParams = MyBase.CreateParams
            CP.ExStyle = CP.ExStyle Or WS_EX_LAYERED
            Return CP
        End Get
    End Property
 
    Public Sub SelectBitmap(ByVal Bmp As Bitmap)
        If Bmp.PixelFormat <> Imaging.PixelFormat.Format32bppArgb Then
            Throw New ApplicationException("The bitmap must be 32bpp with alpha-channel.")
        End If
        Dim screenDc As IntPtr = GetDC(IntPtr.Zero)
        Dim memDc As IntPtr = CreateCompatibleDC(screenDc)
        Dim hBitmap As IntPtr = IntPtr.Zero
        Dim hOldBitmap As IntPtr = IntPtr.Zero
        hBitmap = Bmp.GetHbitmap(Color.FromArgb(0))
        hOldBitmap = SelectObject(memDc, hBitmap)
        Dim newSize As New Size(Bmp.Width, Bmp.Height)
        Dim sourceLocation As New Point(0, 0)
        Dim newLocation As New Point(Me.Left, Me.Top)
        Dim blend As New BLENDFUNCTION()
        blend.BlendOp = AC_SRC_OVER
        blend.BlendFlags = 0
        blend.SourceConstantAlpha = 255
        blend.AlphaFormat = AC_SRC_ALPHA
        UpdateLayeredWindow(Me.Handle, screenDc, newLocation, newSize, memDc, sourceLocation, 0, blend, ULW_ALPHA)
        ReleaseDC(IntPtr.Zero, screenDc)
        If hBitmap <> IntPtr.Zero Then
            SelectObject(memDc, hOldBitmap)
            DeleteObject(hBitmap)
        End If
        DeleteDC(memDc)
        'Renvoi 0
        MsgBox(Marshal.GetLastWin32Error)
    End Sub
 
    Private Sub InitializeComponent()
        Me.SuspendLayout()
        Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(284, 261)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None
        Me.Name = "Form2"
        Me.Text = "Form2"
        Me.TopMost = True
        Me.ResumeLayout(False)
    End Sub
 
End Class | 
Partager