Un petit code pour donner n'importe quel forme à une fenêtre
On dessine une image de la taille de la fenêtre avec en mauve les zones qui seront transparentes.
cette image sera appliqué a la fenêtre.
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 3.9
;
; Explication du programme :
; Pour dessiner une fenêtre avec une forme dépendant d'une image
Procedure SkinWin(Window, Image)
Protected x, y, Region_Temp, Region_Totale, Largeur, Hauteur
; On applique le skin à la fenêtre
Largeur = ImageWidth(Image) - 1
Hauteur = ImageHeight(Image) - 1
Region_Totale = CreateRectRgn_(0, 0, Largeur + 1, Hauteur + 1) ; on crée une region de la taille de la fenêtre
StartDrawing(ImageOutput(Image))
For X1 = 0 To Largeur
For Y1 = 0 To Hauteur
If Point(X1, Y1) = $FF00FF
Y2 = Y1
While X2 < Largeur And Point(X1, Y2 + 1) = $FF00FF
Y2 + 1
Wend
Region_Temp = CreateRectRgn_(X1, Y1, X1 + 1, Y2 + 1) ; On retire le point de la region
CombineRgn_(Region_Totale, Region_Totale, Region_Temp, #RGN_DIFF)
DeleteObject_(Region_Temp)
Y1 = Y2
EndIf
Next
Next
StopDrawing()
SetWindowRgn_(WindowID(Window), Region_Totale, 1) ; On applique la region
DeleteObject_(Region_Totale) ; On efface la region
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(0, 0, 0, 300, 300, "Skin", #PB_Window_BorderLess | #PB_Window_ScreenCentered) = 0 Or CreateGadgetList(WindowID(0)) = 0
End
EndIf
; La fenêtre doit obligatoirement être avec le style #PB_Window_BorderLess
SetWindowColor(0, RGB(255, 0, 0))
; On crée une image qui va servir de skin (elle doit avoir la taille de la fenêtre)
CreateImage(0, 300, 300)
StartDrawing(ImageOutput(0))
; La couleur mauve $FF00FF ou RGB(255, 0, 255) représente la partie transparente de la fenêtre
Box(250, 0, 50, 30, $FF00FF)
Circle(200, 200, 50, $FF00FF)
Circle(250, 230, 50, $FF00FF)
Ellipse(50, 120, 40, 20, $FF00FF)
LineXY(50, 50, 250, 100, $FF00FF)
StopDrawing()
Temps = ElapsedMilliseconds()
; ExtCreateRegion : a voir
SkinWin(0, 0)
Temps = ElapsedMilliseconds() - Temps
; On place un bouton pour quitter
ButtonGadget(0, 0, 0, 100, 25, "Quitter")
; On affichage le temps nécesssaire pour créer le masque
TextGadget(#PB_Any, 0, 25, 100, 15, Str(Temps) + " ms")
Repeat
Event = WaitWindowEvent()
If Event = #WM_LBUTTONDOWN
SendMessage_(WindowID(0), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
EndIf
If Event = #PB_Event_Gadget
Select EventGadget() ; boutons, zone de texte, ...
Case 0 ; On quitte le programme
Event = #PB_Event_CloseWindow
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
End
Donc patience
