; Auteur : Le Soldat Inconnu
; Version de PB : 3.90
;
; Explication du programme :
; Donner à une fenêtre une forme spécifique. Par exemple faire une fenêtre ronde ou triangulaire.
Enumeration
#Quitter
#Forme1
#Forme2
#Forme3
#Forme4
#Forme5
EndEnumeration
Procedure Forme()
If GetGadgetState ( #Forme1 ) ; si on a choisi la forme 1
Region = CreateRoundRectRgn_ (0, 0, WindowWidth (), WindowHeight (), 40, 60) ; Création de la région pour faire une fenêtre avec les angles arrondis
; CreateRoundRectRgn_(X1, Y1, X2, Y2, R1, R2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
; R1, R2 : rayon de l'ellipse qui va servir à arrondir les angles de la region
SetWindowRgn_ ( WindowID (), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
ElseIf GetGadgetState ( #Forme2 ) ; si on a choisi la forme 2
Region = CreateEllipticRgn_ (0, 0, WindowWidth (), WindowHeight ()) ; Création de la région pour faire une fenêtre elliptique
; CreateEllipticRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
SetWindowRgn_ ( WindowID (), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
ElseIf GetGadgetState ( #Forme3 ) ; si on a choisi la forme 3
Region = CreatePolygonRgn_ (?Triangle, 4, #Alternate ) ; Création de la région pour faire une fenêtre elliptique
; CreateRoundRectRgn_(Array, NbPoints, Type)
; Array : Adresse de la liste ou de la Data
; NbPoints : Nombre de points du polygone + 1 (car on fait une boucle donc on a 2 fois le premier point)
; Type : Voir msdn
SetWindowRgn_ ( WindowID (), Region, #True ) ; On applique la région
DeleteObject_ (Region) ; On supprime la région
ElseIf GetGadgetState ( #Forme4 ) ; si on a choisi la forme 4
Region1 = CreateRectRgn_ (0, 0, WindowWidth (), WindowHeight ()) ; Création d'une région en rectangle
Region2 = CreateRectRgn_ (10, 10, WindowWidth () - 10, 50) ; Création d'une région en rectangle
; CreateRectRgn_(X1, Y1, X2, Y2)
; X1, Y1 : coordonné du point haut gauche de la region
; X1, Y1 : coordonné du point haut gauche de la region
CombineRgn_ (Region1, Region1, Region2, #RGN_DIFF ) ; On combine les 2 régions
; Les modes suivants sont disponibles :
; #RGN_AND : Intersection
; #RGN_OR : Union
; #RGN_DIFF : Différences
; #RGN_XOR : Union moins les intersections
SetWindowRgn_ ( WindowID (), Region1, #True ) ; On applique la région finale
DeleteObject_ (Region1) ; On supprime les régions
DeleteObject_ (Region2)
ElseIf GetGadgetState ( #Forme5 ) ; si on a choisi la forme 5
Region1 = CreatePolygonRgn_ (?Triangle, 4, #Alternate )
Region2 = CreateEllipticRgn_ (0, 0, WindowWidth (), WindowHeight ())
CombineRgn_ (Region1, Region1, Region2, #RGN_OR ) ; On combine les 2 régions
SetWindowRgn_ ( WindowID (), Region1, #True ) ; On applique la région finale
DeleteObject_ (Region1) ; On supprime les régions
DeleteObject_ (Region2)
EndIf
EndProcedure
; Création de la fenêtre et dela GadgetList
If OpenWindow (0, 0, 0, 400, 400, #PB_Window_Borderless | #PB_Window_ScreenCentered , "Test" ) = 0 Or CreateGadgetList ( WindowID (0)) = 0
End
EndIf
; Création des boutons et de l'option d'affichage
ButtonGadget ( #Quitter , 100, 100, 200, 20, "Quitter" )
OptionGadget ( #Forme1 , 100, 125, 200, 15, "Angles arrondis" )
OptionGadget ( #Forme2 , 100, 140, 200, 15, "Ronde" )
OptionGadget ( #Forme3 , 100, 155, 200, 15, "Triangle" )
OptionGadget ( #Forme4 , 100, 170, 200, 15, "Trouée" )
OptionGadget ( #Forme5 , 100, 185, 200, 15, "Triangle + Rond" )
Repeat
Event = WaitWindowEvent ()
If Event = #PB_EventGadget
Select EventGadgetID () ; boutons, zone de texte, ...
Case #Quitter
Event = #PB_EventCloseWindow ; On quitte
Default
Forme() ; sinon, on change la forme de la fenêtre
EndSelect
EndIf
Until Event = #PB_EventCloseWindow
End
DataSection
Triangle :
Data.l 200, 400, 0, 0, 400, 0, 200, 400 ; Coordonnées des points du triangle en x, y (il faut faire une boucle donc on revient au premier point du triangle
EndDataSection