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 : Sélectionner tout - Visualiser dans une fenêtre à part
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