et voilà, donc à partir de ton image PNG "About_alpha.png" mise avec le fichier PB
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.40
;
; Explication du programme :
; Pour faire une fenêtre "A propos"
ProcedureDLL SetLayeredWindow2(WindowID) ; Mettre l'attribut WS_EX_LAYERED à la fenêtre
SetWindowLong_(WindowID, #GWL_EXSTYLE, GetWindowLong_(WindowID, #GWL_EXSTYLE) | #WS_EX_LAYERED) ; Mettre l'attribut WS_EX_LAYERED à la fenêtre
EndProcedure
Procedure AlphaImageWindow2(WindowID, ImageID) ; Mettre une image PNG comme fond d'une fenêtre
Protected Image_HDC, Image_Bitmap.BITMAP, ContextOffset.POINT, Blend.BLENDFUNCTION, Image
; Dimension de l'image
GetObject_(ImageID, SizeOf(BITMAP), @Image_Bitmap)
Image = CreateImage(#PB_Any, Image_Bitmap\bmWidth, Image_Bitmap\bmHeight, 32)
StartDrawing(ImageOutput(Image))
DrawingMode(#PB_2DDrawing_AlphaBlend)
DrawAlphaImage(ImageID, 0, 0)
DrawingMode(#PB_2DDrawing_AlphaChannel)
DrawAlphaImage(ImageID, 0, 0)
StopDrawing()
; Chargement du HDC
Image_HDC = CreateCompatibleDC_(#NULL)
Image_Ancienne = SelectObject_(Image_HDC, ImageID(Image))
; L'image est mise en skin de la fenêtre
Blend\SourceConstantAlpha = 255 ; niveau de transparence
Blend\AlphaFormat = 1 ; Support de la couche alpha
Blend\BlendOp = 0
Blend\BlendFlags = 0
UpdateLayeredWindow_(WindowID, 0, 0, @Image_Bitmap + 4, Image_HDC, @ContextOffset, 0, @Blend, 2)
; Fermeture du HDC
SelectObject_(Image_HDC, Image_Ancienne)
DeleteDC_(Image_HDC)
; Supression de l'image
FreeImage(Image)
EndProcedure
UsePNGImageDecoder()
LoadImage(0, "About_Alpha.png")
; Création de la fenêtre et de la GadgetList, de la même taille que l'image
If OpenWindow(0, 0, 0, ImageWidth(0), ImageHeight(0), "A propos", #PB_Window_BorderLess | #PB_Window_ScreenCentered) = 0
End
EndIf
SetLayeredWindow2(WindowID(0))
AlphaImageWindow2(WindowID(0), ImageID(0))
; La zone de texte
If OpenWindow(1, WindowX(0) + 70, WindowY(0) + 82, 407, 171, "A propos", #PB_Window_BorderLess, WindowID(0)) = 0
End
EndIf
EditorGadget(0, 0, 0, 407, 171, #PB_Editor_ReadOnly)
Texte.s = "Fenêtre : " + #CRLF$
Texte + "- Je suis une fenêtre 'A propos'" + #CRLF$
Texte + "- Et comme je suis belle !" + #CRLF$
Texte + "- Oh mirroir mon beau mirroir" + #CRLF$
Texte + "- Qui est la plus belle ?" + #CRLF$
Texte + "Le mirroir" + #CRLF$
Texte + "- C'est la fenêtre de ma chambre !" + #CRLF$
SetGadgetText(0, Texte)
; Chargement de curseur
Curseur_Deplacer = LoadCursor_(0, #IDC_SIZEALL)
Curseur_Bouton = LoadCursor_(0, #IDC_HAND)
Curseur_Normal = LoadCursor_(0, #IDC_ARROW)
Repeat
If ClicDroit_Deplacer ; si le bouton droit de la souris est appuyé, on déplace la fenêtre en même temps que la souris
Event = WindowEvent()
ResizeWindow(0, DesktopMouseX() - PositionX, DesktopMouseY() - PositionY, #PB_Ignore, #PB_Ignore)
ResizeWindow(1, WindowX(0) + 70, WindowY(0) + 82, #PB_Ignore, #PB_Ignore)
Else
Event = WaitWindowEvent()
EndIf
Select Event
Case #WM_MOUSEMOVE
If WindowMouseX(0) >= 540 And WindowMouseY(0) >= 340
If Souris_Fermer = 0
SetClassLong_(WindowID(0), #GCL_HCURSOR, Curseur_Bouton)
Souris_Fermer = 1
EndIf
Else
If Souris_Fermer = 1
SetClassLong_(WindowID(0), #GCL_HCURSOR, Curseur_Normal)
Souris_Fermer = 0
EndIf
EndIf
Case #WM_LBUTTONDOWN
If WindowMouseX(0) >= 540 And WindowMouseY(0) >= 340
; Si on clique pour fermer
Event = #PB_Event_CloseWindow
Else
; Sinon, on déplace la fenêtre
ClicDroit_Deplacer = 1
PositionX = WindowMouseX(0)
PositionY = WindowMouseY(0)
SetClassLong_(WindowID(0), #GCL_HCURSOR, Curseur_Deplacer) ; choix du curseur déplacement
EndIf
Case #WM_LBUTTONUP
ClicDroit_Deplacer = 0
SetClassLong_(WindowID(0), #GCL_HCURSOR, Curseur_Normal) ; choix du curseur normal
EndSelect
Until Event = #PB_Event_CloseWindow