[VB.NET] Form avec des Nuances de Transparence !!
Bonjour,
Je félicite tout d'abord les auteurs de ce sujet sur le forum "Delphi" de Developpez.com:
http://www.developpez.net/forums/vie....php?p=1398111
Car il traite d'un sujet qui n'est que trop peu abordé sur la toile.
J'essaye depuis plusieurs semaines de créer une Form avec des dégradés de transparence. Comme il est possible de le voir sur les widgets de yahoo ou d'opéra.
Je sais maintenant qu'il s'agit de paramétrisation pointu du "Layered Windows" grâcé particulierement à l'API "UpdateLayeredWindow" permettant d'appliquer une transparence pixel par pixel sur une Form.
Voici aussi le seul autre sujet qui traite réellement du sujet, avec même des sources en C#, et une démonstration exeptionnelle de ce qu'il est possible d'obtenir:
http://www.thecodeproject.com/cs/med...lpha_sharp.asp
Alors j'essaye de faire pareil en VB.NET, mais evidement, je n'y arrive pas! Je pense qu'il y a une tonne d'erreur! Voici mon code:
Code:
1 2 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
| Private Structure BLENDFUNCTION
Dim BlendOp As Byte
Dim BlendFlags As Byte
Dim SourceConstantAlpha As Byte
Dim AlphaFormat As Byte
End Structure
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000
Private Declare Function UpdateLayeredWindow Lib "user32.dll" Alias "GetClassLongA" (ByVal hWnd As IntPtr,hdcDst As IntPtr, pptDst As Point,psize As Size, hdcSrc As IntPtr,pptSrc As Point, crKey As Integer,pblend As BLENDFUNCTION, dwFlags As Integer) As Boolean
Private Declare Auto Function SetWindowLong Lib "User32.Dll" (ByVal hWnd As IntPtr,ByVal nIndex As Integer,ByVal dwNewLong As Integer) As Integer
'Le code suivant est un traduction du code delphi posté sur le forum de developpez.com
'J'ai postionné ce code dans le chargement de ma form
Dim bitmaptest As Bitmap = Image.FromFile("c:\test77.png")
SetWindowLong(Me.Handle, GWL_EXSTYLE,WS_EX_LAYERED)
Dim screenDc As IntPtr = nothing
Dim memDc As IntPtr = nothing
Dim hBitmap As IntPtr = IntPtr.Zero
Dim oldBitmap As IntPtr = IntPtr.Zero
hBitmap = bitmaptest.GetHbitmap(Color.FromArgb(0)) 'grab a GDI handle from this GDI+ bitmap
Dim size As Size = new Size(bitmaptest.Width, bitmaptest.Height)
Dim PointSource As Point = new Point(0, 0)
Dim topPos As Point = new Point(Left, Top)
Dim blend As BLENDFUNCTION = new BLENDFUNCTION()
blend.BlendOp = 0
blend.BlendFlags = 0
blend.SourceConstantAlpha = 255
blend.AlphaFormat = 1
Dim bResultat As Boolean = UpdateLayeredWindow(Me.Handle, screenDc, topPos, size, memDc, pointSource, 0, blend, 1)
MessageBox.show(bResultat) |
J'ai essayé de traduire le code delphi du lien que je vous ai mis en début de ce post.
A la fin, j'ai un "False" qui s'affiche, donc la fonction "UpdateLayeredWindow" a échoué!
Voilà, en espérant avoir un peu d'aide :)
PS: d'un point de vue didactique, ça serait tres interessant d'arriver à faire fonctionner ce code, car il n'existe aucun exemple sur internet de cette API utilisé en VB.NET et c'est pas des blagues 8O