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:
J'ai essayé de traduire le code delphi du lien que je vous ai mis en début de ce post.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)
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