Page 1 sur 2

Couleur par defaut

Publié : sam. 11/juin/2016 15:19
par Jeanmarc
Bonjour,

Je peux choisir une Font par défaut qui est ensuite utilisée par les gadgets suivants.
Mais il ne me semble pas possible de faire de même avec la couleur.

Chaque gadget doit-il être initialisé pour la couleur ?

Code : Tout sélectionner

TextGadget(#lab_Generalites, 10, 10,250,20,"GENERALITEES")
SetGadgetColor(#lab_Generalites, #PB_Gadget_BackColor, RGB(25, 50, 150))
SetGadgetColor(#lab_Generalites, #PB_Gadget_FrontColor, RGB(250, 250, 250))
Merci par avance,
JM

Re: Couleur par defaut

Publié : sam. 11/juin/2016 15:38
par Ar-S
Tu ne peux pas effectivement choisir une couleur par defaut.
Tu peux cependant te faire une petite boucle pour colorer tout ça rapidement.

P.S : Pense à mettre tes codes dans les balises [ code ] prévues à cet effet ;) (j'ai corrigé)

Code : Tout sélectionner

Procedure SetColor(GADGET,FRONTC,BACKC)
    SetGadgetColor(GADGET, #PB_Gadget_BackColor, BACKC)
    SetGadgetColor(GADGET, #PB_Gadget_FrontColor, FRONTC)
  EndProcedure
  

If OpenWindow(0,0,0,270,200,"TextGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
   
   If LoadFont(10, "Arial", 14) 
      SetGadgetFont(#PB_Default, FontID(10)) 
      TextGadget(1, 10, 40,250,25,"Gadget texte (texte aligné à droite)", #PB_Text_Right)
      TextGadget(2, 10, 90,250,25,"Gadget texte (texte centré)",#PB_Text_Center)
      TextGadget(3, 10,120,250,25,"Gadget texte avec bordure",#PB_Text_Border)
      TextGadget(4, 10,150,250,25,"Gadget texte (texte centré) + bordure", #PB_Text_Center | #PB_Text_Border) 
      
      For i = 1 To 4
        SetColor(i,  RGB(25, 50, 150), RGB(250, 250, 250)) 
      Next
      
    EndIf 

    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Re: Couleur par defaut

Publié : sam. 11/juin/2016 15:47
par GallyHC
Bonjour,

En reprenant le code d'exemple de Ar-s, on peux ajouter une Enum des ID des divers Gadgets et le dernier étant un TAD de fin. Comme cela on passe tout les gadgets dans le "For Next". Voila l'exemple :

Code : Tout sélectionner

Enumeration gadget 20 
  #text_1
  #text_2
  #text_3
  #text_4
  #text_5
  #text_6
  #ENDGADGET
EndEnumeration

Procedure SetColor(GADGET,FRONTC,BACKC)
;
;
;
  If IsGadget(GADGET)
    SetGadgetColor(GADGET, #PB_Gadget_BackColor, BACKC)
    SetGadgetColor(GADGET, #PB_Gadget_FrontColor, FRONTC)
  EndIf

EndProcedure

If OpenWindow(0,0,0,270,200,"TextGadget",#PB_Window_SystemMenu | #PB_Window_ScreenCentered) 
  If LoadFont(10, "Arial", 14) 
    SetGadgetFont(#PB_Default, FontID(10)) 
    TextGadget(#text_1, 10, 40,250,25,"Gadget texte (texte aligné à droite)", #PB_Text_Right)
    TextGadget(#text_2, 10, 90,250,25,"Gadget texte (texte centré)",#PB_Text_Center)
    TextGadget(#text_3, 10,120,250,25,"Gadget texte avec bordure",#PB_Text_Border)
    TextGadget(#text_4, 10,150,250,25,"Gadget texte (texte centré) + bordure", #PB_Text_Center | #PB_Text_Border) 
    
    For i = #text_1 To #ENDGADGET - 1
    SetColor(i,  RGB(25, 50, 150), RGB(250, 250, 250)) 
    Next
  EndIf 
  
  Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
EndIf
Cordialement,
GallyHC

Couleur par defaut

Publié : sam. 11/juin/2016 16:53
par Jeanmarc
Merci à vous AR-S et GallyHC,

Oui bien sûr, c'est magique la programmation,

JM

Re: Couleur par defaut

Publié : sam. 11/juin/2016 21:07
par microdevweb
Moi ce que que je fait souvent c'est une macro, qui me place le libellé le string gadget la font et pourquoi pas la couleur

Exemple:

Code : Tout sélectionner

#MainForm=0
#FormFont=0
#GadgetColor=$800000
LoadFont(#FormFont,"Arial",10,#PB_Font_HighQuality)
Enumeration Gadget
    #TxtMonPremierChamps
    #StrMonPremierChamps
    #TxtMonDeuxiemeChamps
    #StrMonDeuxiemeChamps
EndEnumeration
Procedure Exit()
    End
EndProcedure
Define M=10 ;marge
Define  WF=400 ;largueur fenêtre
Define HF=600 ; Hauteur fenêtre
Define WG=WF-(M*2) ;Largeur champs
Define HG=30
Define X=M,Y=M
Macro String(Name,Label)
    ; Remarque: dans une macro les paramètres passés ne sont pas typés, donc même de type texte pas besoins de .s ou $
    ; Toutes les variables, même local dans une procédure sont accessible, une macro n'est pas une procédure mais
    ; plutôt l’équivalent d'un copier coller
    ; le # permet dans une macro de concaténer par exemple le nom d'une variable, pratique :)
    TextGadget(#Txt#Name,X,Y,WG,HG,Label)
    Y+HG
    StringGadget(#Str#Name,X,Y,WG,HG,"")
    Y+HG+M ; descend Y pourle champs suivant
    ; Je modifie la police de caractère
    SetGadgetFont(#Txt#Name,FontID(#FormFont))
    SetGadgetFont(#Str#Name,FontID(#FormFont))
    ; Je modifie la couleur
    SetGadgetColor(#Txt#Name,#PB_Gadget_FrontColor,#GadgetColor)
    SetGadgetColor(#Str#Name,#PB_Gadget_FrontColor,#GadgetColor)
EndMacro
OpenWindow(#MainForm,0,0,800,600,"teste",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
String(MonPremierChamps,"Premier champs")
String(MonDeuxiemeChamps,"Deuxième champs")
; Callback pour la sortie
BindEvent(#PB_Event_CloseWindow,@Exit(),#MainForm)

; Main Loop
Repeat:WaitWindowEvent():ForEver

Re: Couleur par defaut

Publié : dim. 12/juin/2016 7:57
par Micoute
Bravo microdevweb, ça c'est une riche idée et je vais m'en inspirer.

Re: Couleur par defaut

Publié : dim. 12/juin/2016 11:04
par Jeanmarc
Bon, j'entrevois les possibilités des Macros, merci Microweb.
je n'ais pas encore tout compris.

Je découvre PureBasic, j'en suis à essayer les Gadgets de base et je crois comprendre que l'on ne peut pas changer les couleurs des Options et CheckBox et d'autres peut-être.

Dois-je essayer de faire un Gadget perso? Il y a surement une astuce.

Merci encore,

JM

Re: Couleur par defaut

Publié : dim. 12/juin/2016 13:07
par Zorro
pour la coloration , il y a toujours la possiblité d'utiliser les API (version enregistré de Purebasic obligatoire )

Code : Tout sélectionner

Enumeration
	#MainForm
	#Panel
	#Wrapper1
	#Wrapper2
	#Option
	#Check
	#AnotherCheck
	#combo
EndEnumeration

Declare  WindowCallback(WindowID, Message, wParam, lParam)





If OpenWindow(#Mainform, 422, 335, 400, 225, "Test", #PB_Window_SystemMenu)
	PanelGadget(#Panel, 10, 20, 250, 180)   
	
	AddGadgetItem(#Panel, -1, "Tab #1")
	TextGadget(#Wrapper1, 0,0,250,180,"")
	SetGadgetColor(#Wrapper1, #PB_Gadget_BackColor, $B2FCFD)
	
	OptionGadget(#Option, 35, 25, 230, 20, "Option Gadget")
	CheckBoxGadget(#Check, 35, 50, 230, 20, "Check Gadget")
	
	AddGadgetItem(#Panel, -1, "Tab #2")
	TextGadget(#Wrapper2, 0,0,250,180,"")
	SetGadgetColor(#Wrapper2, #PB_Gadget_BackColor, $B8F8CE)
	CheckBoxGadget(#AnotherCheck,20,20,200,20, "Another Check")
	
	ComboBoxGadget(#combo,20,50,200,20)
	AddGadgetItem(#combo,-1,"123")
	AddGadgetItem(#combo,-1,"456")
	AddGadgetItem(#combo,-1,"789")
	SetGadgetState(#combo,0)
	CloseGadgetList()
EndIf
SetWindowCallback(@WindowCallback())


Repeat
	Select WaitWindowEvent()
		Case #PB_Event_Gadget
		
		Case #PB_Event_CloseWindow
		End
	EndSelect
ForEver 


;-Procedure Zone
Procedure WindowCallback(WindowID, Message, wParam, lParam)
	YellowColor = CreateSolidBrush_(rgb(255,255,0))
	GreenColor = CreateSolidBrush_(rgb(0,255,125))
	
	Result = #PB_ProcessPureBasicEvents   
	
	Select Message       
		Case #WM_CTLCOLORSTATIC
		Select lparam
			Case GadgetID(#Option)
			SetBkMode_(wParam,#TRANSPARENT)
			SetTextColor_(wParam, rgb(255,0,0))
			Result = YellowColor
			
			Case GadgetID(#Check)
			SetBkMode_(wParam,#TRANSPARENT)
			SetTextColor_(wParam, rgb(0,255,0))           
			Result = YellowColor           
			
			Case GadgetID(#AnotherCheck)
			SetBkMode_(wParam,#TRANSPARENT)
			SetTextColor_(wParam, rgb(0,0,255))           
			Result = GreenColor    
		EndSelect       
		Case #WM_CTLCOLORLISTBOX ,#WM_CTLCOLOREDIT
		Select lparam
			Case GadgetID(#combo)
			SetBkMode_(wParam,#TRANSPARENT)
			jaune=$EFFE
			Result= CreateSolidBrush_(jaune) ;peint
			SetBkColor_(wParam, jaune) ; couleur Fond; 
			SetTextColor_(wParam,#Red); couleur ecriture
			
		EndSelect
		
	EndSelect
	ProcedureReturn Result
EndProcedure



; Epb


Re: Couleur par defaut

Publié : dim. 12/juin/2016 18:49
par Jeanmarc
Ok, Zorro,

Coté couleur c'est parfait, le fond Option et Check box prennent la couleur que je souhaite.
Cependant au bout de quelques secondes après avoir sollicité plusieurs contrôles tout se bloque.

Même sur le code que tu m'as proposé.
As-tu une idée?

Bonne Soirée,

JM

Re: Couleur par defaut

Publié : dim. 12/juin/2016 19:04
par Zorro
continu la conversation sur le meme sujet, celui que tu as ouvert au debut ...
inutile d'en ouvrir un nouveau a chaque fois ;)
lorsqu'on se connecte au forum on utilise le lien 'Voir les nouveaux messages' en haut a droite
du coup on ne peut rien louper , si tu ajoutes un message a ton topic

chez moi ça ne bloque pas !

ton anti-virus qui fait du zele ??

Re: Couleur par defaut

Publié : dim. 12/juin/2016 19:59
par Jeanmarc
Bon, Ok,

C'est trop compliqué pour simplement mettre une couleur de fond sur un Gadget. Naïvement je m'étonne qu'un langage qui a 16 ans d'existence ne le permette pas.

Je vais tricher et me fabriquer un Gadget perso.
Résoudre le problème avec un éventuel anti-virus n'est pas de ma compétence et surtout je veux que mon truc fonctionne à coup sur, dans toutes les plateformes..

Merci encore,

JM

Re: Couleur par defaut

Publié : dim. 12/juin/2016 20:52
par microdevweb
Jean-marc tu peux changer la couleur des gadgets, dis moi le type de gadget que tu veux faire ?

Re: Couleur par defaut

Publié : dim. 12/juin/2016 21:36
par Jeanmarc
Bonjour microdevweb,

Dans mon projet j'en suis au niveau de l'Interface Utilisateur tout en découvrant PureBasic.

J'ai réussi grâce à vous, de pouvoir changer la couleur de fond de la plupart des Gadgets mais pas Option et CheckBox et peut-être d'autres gadgets.

Bon, j'ai réduit leur dimension au minimum et ajouter un TextGadget (Dont je peux modifier la couleur) Tu comprends, après je positionne le TexGadjet à sa suite pour faire sa légende. Cela me conviens dans un premier temps.
Le fond du BoutonRond de l'option et de la Case du Checkbox restent gris, mais c'est relativement acceptable.

Je pense que d'autres que moi, parmi vous, soucieux d'une belle présentation ont étés confrontés à ce petit problème.

Bonne soirée,

JM

Re: Couleur par defaut

Publié : dim. 12/juin/2016 22:56
par microdevweb
Voici un très bon soft avec plein d'appi (Windows Only) de RsBasic

http://www.purebasic.fr/english/viewtop ... lit=WINAPI

L'autre solution des de passé par un canvas gadget, je te ferais un petit exemple demain

Re: Couleur par defaut

Publié : lun. 13/juin/2016 7:20
par Micoute
Voici de quoi faire plein de gadgets colorés.

Code : Tout sélectionner

; Canvas (Bouton, Boite à cocher, Option, Bascule, Image, Déroulant, Plat)
; Francisé et modifié par Micoute
; Source originale: http://www.purebasic.fr/english/viewtop ... 12&t=62198

DeclareModule MonBouton
  Enumeration Bouton
    #Type_Normal             ; bouton normal par défaut
    #Type_Deroulant          ; bouton normal avec menu/liste déroulante
    #Type_Bascule            ; bouton plat (qui se comporte comme une case à cocher)
    
    #Type_Coche              ; bouton case à cocher
    
    #Type_Radio              ; bouton radio/option
    #Type_BasculeRadio       ; bouton plat (qui se comporte comme un radio/option)
  EndEnumeration
  
  ; Propriétés/attributs-Definir/Obtenir
  
  Enumeration Proprietes
    #Prop_CoulFnd          ; couleur de fond/principale interne
    #Prop_CoulFndExt       ; couleur de fond externe
    #Prop_CoulBord         ; couleur de la bordure
    #Prop_CoulTxt          ; couleur du texte
    #Prop_Justif           ; #PB_Text_Center ou #PB_Text_Right (pour aligner à gauche, utilisez 0)
    #Prop_Type             ; un des #Type_xxx
    #Prop_Gradient         ; 0...100
    #Prop_Rayon            ; comme défini avec RoundBox()
    #Prop_Police           ; numéro de police PB
    #Prop_Menu             ; numéro de menu PB
    #Prop_Texte            ; 
    #Prop_Image            ; numéro image PB
    #Prop_FaireTenirImage  ; image fixe/redimensionnable
    
    #Prop_Etat             ; état souris
    #Prop_Coche_           ; 0/1
    
    #Prop_AuClic           ; événement à effectuer
  EndEnumeration
  
  Declare.i ReinitialisationModele()
  Declare.i DefinirModele(Propriete, Valeur)             ; change une des propriétés par défaut - non associée à un bouton en particulier
  
  Declare.i DefinirPropriete(Gadget, Propriete, Valeur)
  Declare.i ObtenirPropriete(Gadget, Propriete)
  Declare.i DefinirTexte(Gadget, Texte.s)
  Declare.s ObtenirTexte(Gadget)
  Declare.i Verifier(Gadget, Etat = #True)
  Declare.i Activer(Gadget, Etat = #True)
  Declare.i SiCoche_(Gadget)
  Declare.i Siactif(Gadget)
  Declare.i Liberer(Gadget)
  Declare.i Redimensionner(Gadget, x, y, Largeur, Hauteur)
  Declare.i Creer(Gadget, x, y, l, h, Texte.s, Conseil.s="")
  Declare.i Clic(Gadget)                                 ; simule un clic à partir du code
  
EndDeclareModule

Module MonBouton
  EnableExplicit
  
  #Marge_TexteX          = 4     ; marge de gauche/droite du pixel lng texte
  #Marge_TexteY          = 1     ; marge haut/bas en pixel
  
  #Largeur_Coche         = 16    ; largeur de la zone de la case à cocher/radio
  #Largeur_Deroulant     = 20    ; largeur de la zone de la flèche bouton menu
  
  Enumeration                    ; Etat du bouton Canvas
    #Etat_SourisHors    = 0      ; normal
    #Etat_SourisDedans           ; la souris est dedans
    #Etat_ClicSouris             ; le bouton est cliqué/poussé
    #Etat_nonActif               ; le bouton est désactivé
  EndEnumeration
  
  
  Global Coul_Desactive  = $00707070
  Global Coul_Dedans     = $FBEEEEAF
  Global Coul_Pousse     = $FBE16941
  
  Global CoulTxtPousse  = $00FFFFFF
  Global CoulTxtDedans  = $00000000
  
  Prototype.i _ProtoAuClic()
  
  Structure SMonBouton
    
    Gadget.i                ; nombre de gadgets associés au canvas
    Type.i                  ; #Type_xxx
    CoulFnd.i               ; couleur principale/fond
    CoulCoin.i              ; couleur fond/coin des 4 coins rayon d'arrondi utile si > 0
    CoulBord.i              ; couleur bord (-1 : aucun bord)
    CoulTxt.i               ; couleur d'avant plan ou couleur texte
    Justif.i                ; 0/#PB_Text_Center/#PB_Text_Right
    Gradient.i              ; niveau Gradient 0..100
    Rayon.i                 ; rayon x/y
    Police.i                ; numéro police PB
    Image.i                 ; numéro image PB
    FaireTenirImage.i       ; 0/1
    Menu.i                  ; numéro menu popup PB
    Texte.s                 ; texte
    AuClic._ProtoAuClic     ; routine à appeler lorsque le bouton reçoit plein clic (est poussé/vérifié /...)
    
    ; 
    Coche_.i                ; 0/1 vérification pour bouton bascule
    Etat.i                  ; #Prop_Etat_xxx : état souris courant
    
  EndStructure
  
  Global  ML_BTN.SMonBouton   ; bouton-modèle en cours : contient les valeurs attribuées par défaut - peut être changé par code (privé pour ce module)
  
  ;---<<<====>>> aides
  Procedure.i _MonMelangeCouleurs(Coul1, Coul2, Mesure=50)
    Protected R1, V1, B1, R2, V2, B2, Echelle.f = Mesure/100
    
    R1 = Red(Coul1): V1 = Green(Coul1): B1 = Blue(Coul1)
    R2 = Red(Coul2): V2 = Green(Coul2): B2 = Blue(Coul2)
    ProcedureReturn RGB((R1*Echelle) + (R2 * (1-Echelle)), (V1*Echelle) + (V2 * (1-Echelle)), (B1*Echelle) + (B2 * (1-Echelle)))
    
  EndProcedure
  
  Procedure.i _MonDessinTexte(Txt.s,x,y,l,h, MrgX,MrgY, Just=0,Deroul=0)
    Protected x1,x2,y1,y2, mx,al,my,ah
    Protected i,j,lng,ll,hh,x0,l0
    
    mx = MrgX          ; marge horizontale x gauche/droite par défaut
    my = MrgY          ; marge verticale y haut/bas par défaut
    al = l - 2*mx      ; largeur donnée actuelle pour dessiner
    ah = h - 2*my      ; hauteur donnée actuelle pour dessiner
    lng = Len(Txt)     ; longueur du texte en caractères
    
    If al <= 0 Or ah <= 0 Or lng <= 0 : ProcedureReturn : EndIf
    
    ll = TextWidth(Txt)  ; longueur du texte en pixels
    hh = TextHeight(Txt) ; hauteur du texte en pixels
    If ll <= al And hh <= ah
      ; Nous avons assez de place pour écrire tout vers l'avant...
      Select Just
          Case 0
        x1 = x + mx
      Case #PB_Text_Right
        x1 = x + mx + (al - ll)
      Case #PB_Text_Center
        x1 = x + mx + ((al - ll)/2)
      EndSelect
      y1 = y + my + ((ah - hh)/2)
      DrawText(x1,y1,Txt)
      ProcedureReturn
    Else
      If Deroul
        ; Nous pourrions avoir besoin de dérouler le texte sur une autre ligne... lors du déroulement nous ne considérons pas la justification (pour l'instant!)
        lng = Len(txt)
        x1 = x + mx : x2 = x1 + al
        y1 = y + my : y2 = y1 + ah
        
        Protected sMot,eMot,wMot, nn, tMot.s, cc.s
        
        wMot = 0 : sMot = 1: eMot = 0
        For i=1 To lng
          If Mid(txt, i, 1) = " " Or i=lng: eMot = i : EndIf
          
          If eMot > 0 ; nous dessinons ce mot courant
            Repeat
              tMot = Mid(txt, sMot, eMot-sMot+1)
              wMot = TextWidth(tMot)
              
              If x1 + wMot <= x2
                x1 = DrawText(x1,y1,tMot)
                sMot = eMot + 1: eMot = 0
              Else
                If wMot <= al
                  x1 = x + mx         ; nous passons à une nouvelle ligne
                  y1 = y1 + (hh + my)
                  If (y1+hh) > y2  : Break : EndIf
                  x1 = DrawText(x1,y1,tMot)
                  sMot = eMot + 1: eMot = 0
                Else
                  ; nous dessinons caractère par caractère
                  nn = Len(tMot)
                  For j=1 To nn
                    cc = Mid(tMot,j,1)
                    If x1 + TextWidth(cc) <= x2
                      x1 = DrawText(x1,y1,cc)
                      sMot = sMot + 1
                      If j = nn : eMot = 0: EndIf
                    Else
                      x1 = x + mx         ; nous passons à une nouvelle ligne
                      y1 = y1 + (hh + my)
                      Break
                    EndIf
                  Next
                EndIf
              EndIf
              If (y1+hh) > y2  : Break : EndIf
            Until sMot > eMot
            
          EndIf
          If (y1+hh) > y2  : Break : EndIf
        Next
        
      Else
        x1 = x + mx : x2 = x1 + al
        y1 = y + my : y2 = y1 + ah
        i  = 0
        Repeat
          i = i + 1
          If i > lng    : Break : EndIf
          l0 = TextWidth(Mid(txt, i, 1))
          If x1 + l0 > x2 : Break : EndIf
          x1 = DrawText(x1,y1,Mid(txt, i, 1))
        ForEver
      EndIf
    EndIf
    
  EndProcedure
  
  Procedure.i _MonDessinCoche(x,y,l,h, LrgBox, actif, Coche_=#False)
    ;dessiner une case à cocher /(x,y,l,h) est la zone donnée pour le dessin de la case... suppose un StartDrawing !
    Protected ll,hh, x0,y0,xa,ya,xb,yb,xc,yc, CoulFnd = $CD0000
    
    ll = LrgBox : hh = LrgBox
    If ll <= l And hh <= h 
      x0 = x + ((l - ll) / 2)
      y0 = y + ((h - hh) / 2)
      If actif = #False : CoulFnd = $9F9F9F : EndIf
      DrawingMode(#PB_2DDrawing_Default)
      Box(x0  ,y0  ,ll  ,hh  ,CoulFnd)
      Box(x0+1,y0+1,ll-2,hh-2,$D4D4D4)
      Box(x0+2,y0+2,ll-4,hh-4,$FFFFFF)
      ;
      If Coche_
        xb = x0 + (ll / 2) - 1  :   yb = y0 + hh - 5
        xa = x0 + 4             :   ya = yb - xb + xa
        xc = x0 + ll - 4        :   yc = yb + xb - xc
        
        FrontColor($12A43A)
        LineXY(xb,yb  ,xa,ya  ) :   LineXY(xb,yb  ,xc,yc  )
        LineXY(xb,yb-1,xa,ya-1) :   LineXY(xb,yb-1,xc,yc-1) ; déplacer par 1
        LineXY(xb,yb-2,xa,ya-2) :   LineXY(xb,yb-2,xc,yc-2) ; déplacer par 2
      EndIf
    EndIf
    
  EndProcedure
  
  Procedure.i _MonDessinRadio(x,y,l,h, LrgBox, actif, Coche_=#False)
    ; dessiner un bouton radio/option /(x,y,L,h) est la zone donnée pour dessiner le bouton radio/option... suppose un StartDrawing!
    Protected ll,hh, x0,y0, CoulFnd = $CD0000
    
    ll = LrgBox : hh = LrgBox
    If ll <= l And hh <= h 
      x0 = x + l/2 ;((l - ll) / 2)
      y0 = y + h/2 ;((h - hh) / 2)
      If actif = #False : CoulFnd = $9F9F9F : EndIf
      
      DrawingMode(#PB_2DDrawing_Default)
      Circle(x0, y0, LrgBox/2, CoulFnd)
      Circle(x0, y0, LrgBox/2 - 2, $FFFFFF)
      If Coche_
        FrontColor($12A43A): Circle(x0, y0, 3)
      EndIf
    EndIf
    
  EndProcedure
  
  Procedure.i _MonDessinComboDeroulant(x,y,l,h, avecFnd=#False)
    ; dessiner un combo-box-déroulant (x,y,l,h) est la zone donnée pour le dessin .. suppose un StartDrawing!
    Protected x0,y0,ll,hh
    
    ll = 7
    hh = 4
    If ll < l And hh < h 
      If avecFnd
        DrawingMode(#PB_2DDrawing_Gradient)
        BackColor(RGB(224, 226, 226)) : FrontColor(RGB(201, 201, 201)) : LinearGradient(x,y,x,y+h/2)
        Box(x+3,y+3,l-5,h-5)
      EndIf
      
      DrawingMode(#PB_2DDrawing_Default): FrontColor($CD0000)
      Line(x,y+4,1,h-8)
      
      x0 = x + (l - ll)/2 
      y0 = y + (h - hh)/2 - 1
      Line(x0  ,y0  ,ll  ,1)
      Line(x0+1,y0+1,ll-2,1)
      Line(x0+2,y0+2,ll-4,1)
      Line(x0+3,y0+3,ll-6,1)
    EndIf
    
  EndProcedure
  
  ;---<<<====>>> coeur
  Procedure   Dessiner(*monBtn.SMonBouton)
    Protected l,h,x,y, l1,h1,gdt, x0, l0, actif
    Protected gC0,gC1,lng,tCoul ; détails gradient et couleurs texte
    
    If *monBtn = 0
      ProcedureReturn
    EndIf
    
    gdt = *monBtn\Gadget
    
    If StartDrawing(CanvasOutput(gdt)) = 0
      ProcedureReturn
    EndIf
    
    l = GadgetWidth(gdt): h = GadgetHeight(gdt)
    ; commun à tous les cas
    DrawingMode(#PB_2DDrawing_Default)  : Box(0,0,l,h,*monBtn\CoulCoin)
    
    actif = #True : lng = 2
    
    Select *monBtn\Etat
        Case #Etat_nonActif
      actif = #False
      gC0 = $B8B8B8: gC1 = Coul_Desactive: lng = 1: tCoul = $C4C4C4
    
    Case #Etat_SourisDedans 
      ;gC0 = $FFFFFF: gC1 = Coul_Dedans: lng = 2: tCoul = $000000
      gC1 = Coul_Dedans: lng = 2: tCoul = CoulTxtDedans
      gC0 = _MonMelangeCouleurs($FFFFFF, Coul_Dedans, *monBtn\Gradient)
    
    Case #Etat_SourisHors
      gC1 = *monBtn\CoulFnd: lng = 2: tCoul = *monBtn\CoulTxt
      gC0 = _MonMelangeCouleurs($FFFFFF, *monBtn\CoulFnd, *monBtn\Gradient)
    EndSelect
    
    If (*monBtn\Etat = #Etat_ClicSouris) Or ((*monBtn\Type = #Type_Bascule) And *monBtn\Coche_) Or ((*monBtn\Type = #Type_BasculeRadio) And *monBtn\Coche_)
      gC1 = Coul_Pousse: gC0 = $FFFFFF: lng = 3: tCoul = CoulTxtPousse
    EndIf
    
    FrontColor(gC1)
    If *monBtn\Gradient > 0
      BackColor(gC0) : LinearGradient(0,0,0,h/lng)
      DrawingMode(#PB_2DDrawing_Gradient)
    Else
      DrawingMode(#PB_2DDrawing_Default)
    EndIf
    RoundBox(0,0,l,h,*monBtn\Rayon,*monBtn\Rayon)
    
    
    ; décoration et textes 
    If IsImage(*monBtn\Image)
      If *monBtn\FaireTenirImage
        DrawImage(ImageID(*monBtn\Image), 4,4,l-8,h-8)      ; redimensionner/faire tenir
      Else
        ; taille fixe
        DrawingMode(#PB_2DDrawing_AlphaBlend)
        l1 = (l - ImageWidth( *monBtn\Image))/2 : If l1 < 0 : l1 = 0 : EndIf
        h1 = (h - ImageHeight(*monBtn\Image))/2 : If h1 < 0 : h1 = 0 : EndIf
        DrawImage(ImageID(*monBtn\Image), l1, h1)
      EndIf
    EndIf
    
    Select *monBtn\Type
      Case #Type_Normal, #Type_Bascule, #Type_BasculeRadio
        If *monBtn\Texte  <> ""
          DrawingMode(#PB_2DDrawing_Transparent) : FrontColor(tCoul)
          If IsFont(*monBtn\Police) : DrawingFont(FontID(*monBtn\Police)) : EndIf
          _MonDessinTexte(*monBtn\Texte,0,0,l,h, #Marge_TexteX,#Marge_TexteY, *monBtn\Justif)
        EndIf
        
      Case #Type_Coche
        _MonDessinCoche(#Marge_TexteX, 0, #Largeur_Coche, h, #Largeur_Coche, actif, *monBtn\Coche_)
        If *monBtn\Texte  <> ""
          DrawingMode(#PB_2DDrawing_Transparent) : FrontColor(tCoul)
          If IsFont(*monBtn\Police) : DrawingFont(FontID(*monBtn\Police)) : EndIf
          x0 = #Marge_TexteX + #Largeur_Coche
          l0 = l - x0
          _MonDessinTexte(*monBtn\Texte,x0,0,l0,h, #Marge_TexteX,#Marge_TexteY, *monBtn\Justif)
        EndIf
        
      Case #Type_Radio
        _MonDessinRadio(#Marge_TexteX, 0, #Largeur_Coche, h, #Largeur_Coche, actif, *monBtn\Coche_)
        If *monBtn\Texte  <> ""
          DrawingMode(#PB_2DDrawing_Transparent) : FrontColor(tCoul)
          If IsFont(*monBtn\Police) : DrawingFont(FontID(*monBtn\Police)) : EndIf
          x0 = #Marge_TexteX + #Largeur_Coche
          l0 = l - x0
          _MonDessinTexte(*monBtn\Texte,x0,0,l0,h, #Marge_TexteX,#Marge_TexteY, *monBtn\Justif)
        EndIf
        
      Case #Type_Deroulant
        _MonDessinComboDeroulant(l-#Largeur_Deroulant, 0, #Largeur_Deroulant, h)
        If *monBtn\Texte  <> ""
          DrawingMode(#PB_2DDrawing_Transparent) : FrontColor(tCoul)
          If IsFont(*monBtn\Police) : DrawingFont(FontID(*monBtn\Police)) : EndIf
          l0 = l - #Largeur_Deroulant
          _MonDessinTexte(*monBtn\Texte,0,0,l0,h, #Marge_TexteX,#Marge_TexteY, *monBtn\Justif)
        EndIf
    EndSelect
    
    ; commun dans tous les cas
    If *monBtn\CoulBord >= 0 
      DrawingMode(#PB_2DDrawing_Outlined)
      RoundBox(0,0,l,h,*monBtn\Rayon,*monBtn\Rayon,*monBtn\CoulBord)
    EndIf
    StopDrawing()
    
  EndProcedure
  
  Procedure.i GereEvenement(Gadget, TpEvnt)
    ;gère le nouvel événement, met à jour l'état... et retourne True si l'utilisateur clique sur le btn = > nous allons procéder
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    Protected EtatPrv,mx,my,dd, siClique_
    
    If *monBtn = 0 : ProcedureReturn #False : EndIf
    
    If *monBtn\Etat = #Etat_nonActif : ProcedureReturn #False : EndIf
    EtatPrv = *monBtn\Etat
    
    Select TpEvnt
        
      Case #PB_EventType_Input
        If Chr(GetGadgetAttribute(Gadget, #PB_Canvas_Input)) = " "
          *monBtn\Coche_ = Bool(*monBtn\Coche_ XOr #True)
          *monBtn\Etat = #Etat_SourisHors
          siClique_ = #True                         ; ceci sera retourné par le traitement
        EndIf
        
      Case #PB_EventType_KeyDown
        If GetGadgetAttribute(Gadget, #PB_Canvas_Key ) = #PB_Shortcut_Return
          *monBtn\Coche_ = Bool(*monBtn\Coche_ XOr #True)
          *monBtn\Etat = #Etat_SourisHors
          siClique_ = #True                         ; ceci sera retourné par le traitement
        EndIf
        
      Case #PB_EventType_MouseEnter
        *monBtn\Etat  = #Etat_SourisDedans
        
      Case #PB_EventType_MouseMove  ; nous en avons besoin parce que le mouse-up est reçu avant l'éloignement de la souris (mouse leave)
        If *monBtn\Etat <> #Etat_ClicSouris
          *monBtn\Etat = #Etat_SourisDedans
        EndIf
        
      Case #PB_EventType_MouseLeave
        *monBtn\Etat  = #Etat_SourisHors
        
      Case  #PB_EventType_LeftButtonDown
        *monBtn\Etat  = #Etat_ClicSouris
        
      Case #PB_EventType_LeftButtonUp
        mx = GetGadgetAttribute(Gadget, #PB_Canvas_MouseX)
        my = GetGadgetAttribute(Gadget, #PB_Canvas_MouseY)
        If  (mx < GadgetWidth(Gadget)) And (my < GadgetHeight(Gadget))  And (mx >= 0) And (my >= 0)
          If (EtatPrv = #Etat_ClicSouris)
            siClique_    = #True       ; ceci sera retourné par le traitement
                                       ;*monBtn\Etat   = #Etat_SourisDedans
            *monBtn\Etat   = #Etat_SourisHors
            Select *monBtn\Type
              Case #Type_Bascule, #Type_Coche
                *monBtn\Coche_ = Bool(*monBtn\Coche_ XOr #True)
              Case #Type_Radio, #Type_BasculeRadio
                *monBtn\Coche_ = #True
              Case #Type_Deroulant
                dd = GadgetWidth(Gadget) - mx
                If IsMenu(*monBtn\Menu) And (dd < #Largeur_Deroulant)
                  DisplayPopupMenu(*monBtn\Menu, WindowID(GetActiveWindow()))
                EndIf
            EndSelect
          EndIf
        EndIf
      Default
        ProcedureReturn #False 
    EndSelect
    
    ; nous dessinons si besoin (nouvel état different) ou vérification changée
    If siClique_ Or (EtatPrv <> *monBtn\Etat)
      Dessiner(*monBtn)
    EndIf
    
    ; siClique_ = True => un clic a été reçu par ce bouton, prêt pour le procédé
    ProcedureReturn siClique_ 
    
  EndProcedure
  
  Procedure.i GestionEvenements()
    If GereEvenement(EventGadget(), EventType())
      Protected *monBtn.SMonBouton = GetGadgetData(EventGadget())
      ;Debug " Clic sur " + *monBtn\Texte
      If *monBtn\AuClic
        *monBtn\AuClic()
      EndIf
    EndIf
    
  EndProcedure
  
  Procedure.i Clic(Gadget)
    ; simule un clic, peut être appelé par code
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    If *monBtn
      If *monBtn\AuClic : *monBtn\AuClic() : EndIf
    EndIf
    
  EndProcedure
  
  Procedure.i ReinitialisationModele()
    With ML_BTN
      \Gadget      = -1
      \Type        = #Type_Normal
      \CoulFnd     = $00EED3B9 ;$00ED9667
      \CoulCoin    = $FFFFFF
      \CoulBord    = $FFFFFF
      \CoulTxt     = $000000
      \Justif      = #PB_Text_Center
      \Gradient    = 60
      \Rayon       = 7
      \Police      = -1
      \Image       = -1
      \FaireTenirImage    = 0
      \Menu        = -1
      \Texte       = "Nouveau Bouton"
      \Coche_      = #False
      \Etat        = #Etat_SourisHors
    EndWith
  EndProcedure
  
  Procedure.i DefinirModele(Propriete, Valeur)
    With ML_BTN
      ; réviser le modèle par défaut
      Select Propriete
        Case #Prop_CoulFnd         : \CoulFnd         = Valeur
        Case #Prop_CoulFndExt      : \CoulCoin        = Valeur
        Case #Prop_CoulBord        : \CoulBord        = Valeur
        Case #Prop_CoulTxt         : \CoulTxt         = Valeur
        Case #Prop_Police          : \Police          = Valeur
        Case #Prop_Rayon           : \Rayon           = Valeur
        Case #Prop_Justif          : \Justif          = Valeur
        Case #Prop_Type            : \Type            = Valeur
        Case #Prop_Image           : \Image           = Valeur
        Case #Prop_FaireTenirImage : \FaireTenirImage = Valeur
        Case #Prop_Menu            : \Menu            = Valeur
        Case #Prop_Etat            : \Etat            = Valeur
        Case #Prop_Coche_          : \Coche_          = Valeur
        Case #Prop_Gradient        : \Gradient        = Valeur
          ;If Valeur > 100 : Valeur = 100 : EndIf
          ;If Valeur <   0 : Valeur =   0 : EndIf
        Default
          ProcedureReturn
      EndSelect
    EndWith
  EndProcedure
  
  Procedure.i DefinirPropriete(Gadget, Propriete, Valeur)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    Select Propriete
      Case #Prop_CoulFnd         : *monBtn\CoulFnd         = Valeur
      Case #Prop_CoulFndExt      : *monBtn\CoulCoin        = Valeur
      Case #Prop_CoulBord        : *monBtn\CoulBord        = Valeur
      Case #Prop_CoulTxt         : *monBtn\CoulTxt         = Valeur
      Case #Prop_Police          : *monBtn\Police          = Valeur
      Case #Prop_Rayon           : *monBtn\Rayon           = Valeur
      Case #Prop_Justif          : *monBtn\Justif          = Valeur
      Case #Prop_Type            : *monBtn\Type            = Valeur
      Case #Prop_Image           : *monBtn\Image           = Valeur
      Case #Prop_FaireTenirImage : *monBtn\FaireTenirImage = Bool(Valeur)
      Case #Prop_Menu            : *monBtn\Menu            = Valeur
      Case #Prop_Etat            : *monBtn\Etat            = Valeur
      Case #Prop_Coche_          : *monBtn\Coche_          = Valeur
      Case #Prop_Gradient        : *monBtn\Gradient        = Valeur
      Case #Prop_AuClic          : *monBtn\AuClic          = Valeur
      Default                    : ProcedureReturn      ;pas besoin de dessiner
    EndSelect
    DefinirModele(Propriete, Valeur)
    Dessiner(*monBtn)
    
  EndProcedure
  
  Procedure.i ObtenirPropriete(Gadget, Propriete)
    Protected Valeur = -1, *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    Select Propriete
      Case #Prop_CoulFnd         : Valeur = *monBtn\CoulFnd
      Case #Prop_CoulFndExt      : Valeur = *monBtn\CoulCoin
      Case #Prop_CoulBord        : Valeur = *monBtn\CoulBord
      Case #Prop_CoulTxt         : Valeur = *monBtn\CoulTxt
      Case #Prop_Police          : Valeur = *monBtn\Police
      Case #Prop_Rayon           : Valeur = *monBtn\Rayon
      Case #Prop_Justif          : Valeur = *monBtn\Justif
      Case #Prop_Type            : Valeur = *monBtn\Type
      Case #Prop_Image           : Valeur = *monBtn\Image
      Case #Prop_FaireTenirImage : Valeur = *monBtn\FaireTenirImage
      Case #Prop_Menu            : Valeur = *monBtn\Menu
      Case #Prop_Etat            : Valeur = *monBtn\Etat
      Case #Prop_Coche_          : Valeur = *monBtn\Coche_
      Case #Prop_Gradient        : Valeur = *monBtn\Gradient
      Case #Prop_AuClic          : Valeur = *monBtn\AuClic
    EndSelect
    ProcedureReturn Valeur
    
  EndProcedure
  
  Procedure.i DefinirTexte(Gadget, Texte.s)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    *monBtn\Texte = Texte
    Dessiner(*monBtn)
  EndProcedure
  
  Procedure.s ObtenirTexte(Gadget)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    ProcedureReturn *monBtn\Texte
  EndProcedure
  
  Procedure.i Verifier(Gadget, Etat = #True)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    If *monBtn = 0
      ProcedureReturn
    EndIf
    If *monBtn\Type > #Type_Deroulant
      *monBtn\Coche_ = Etat
      Dessiner(*monBtn)
    EndIf
  EndProcedure
  
  Procedure.i Activer(Gadget, Etat = #True)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    If *monBtn = 0
      ProcedureReturn
    EndIf
    If Etat
      *monBtn\Etat = #Etat_SourisHors
    Else
      *monBtn\Etat = #Etat_nonActif
    EndIf
    DisableGadget(Gadget, Bool(Not Etat))
    Dessiner(*monBtn)
    
  EndProcedure
  
  Procedure.i SiCoche_(Gadget)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    If *monBtn = 0
      ProcedureReturn #False
    EndIf
    If *monBtn\Type  > #Type_Deroulant And *monBtn\Coche_
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndProcedure
  
  Procedure.i Siactif(Gadget)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    If *monBtn = 0
      ProcedureReturn #False
    EndIf
    If *monBtn\Etat <> #Etat_nonActif
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndProcedure
  
  Procedure.i Liberer(Gadget)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    If *monBtn 
      UnbindGadgetEvent(Gadget, @GestionEvenements())
      ClearStructure(*monBtn, SMonBouton)
      FreeMemory(*monBtn)
    EndIf
    FreeGadget(Gadget)
  EndProcedure
  
  Procedure.i Redimensionner(Gadget, x, y, Largeur, Hauteur)
    Protected *monBtn.SMonBouton = GetGadgetData(Gadget)
    
    ResizeGadget(Gadget, x, y, Largeur, Hauteur)
    Dessiner(*monBtn)
  EndProcedure
  
  Procedure.i Creer(Gadget, x, y, l, h, Texte.s, Conseil.s="")
    ; nouveau bouton selon les paramètres par défaut dans le modèle quel qu'il soit
    Protected Bouton, *monBtn.SMonBouton
    
    Bouton = CanvasGadget(Gadget, x, y, l, h, #PB_Canvas_Keyboard);|#PB_Canvas_DrawFocus)
    If Bouton
      If Gadget <> #PB_Any
        Bouton = Gadget
      EndIf
      
      *monBtn = AllocateMemory(SizeOf(SMonBouton))
      InitializeStructure(*monBtn, SMonBouton)
      CopyStructure(@ML_BTN, *monBtn, SMonBouton)
      
      *monBtn\Gadget     = Bouton
      *monBtn\Coche_    = #False
      *monBtn\Etat      = #Etat_SourisHors
      *monBtn\Texte       = Texte
      *monBtn\AuClic    = 0
      SetGadgetData(Bouton, *monBtn)
      SetGadgetAttribute(Bouton,#PB_Canvas_Cursor,#PB_Cursor_Hand)
      GadgetToolTip(Bouton, Conseil)
      BindGadgetEvent(Bouton, @GestionEvenements())
      Dessiner(*monBtn)
    EndIf
    
    ProcedureReturn Bouton
    
  EndProcedure
  
  ; appeler ReinitialisationModele()
  ReinitialisationModele()
  
EndModule


;---<<<====>>> exemples et cas prédéterminés exceptionnellement
CompilerIf #PB_Compiler_IsMainFile
  
  UsePNGImageDecoder()
  
  UseModule MonBouton
  
  Procedure.i MonBouton_Deroulant(Gadget, x, y, Largeur, Hauteur, Menu, Texte.s)
    ; bouton déroulant
    DefinirModele(#Prop_Type, #Type_Deroulant)
    DefinirModele(#Prop_Justif, #PB_Text_Center)
    DefinirModele(#Prop_Menu, Menu)
    
    ProcedureReturn Creer(Gadget, x, y, Largeur, Hauteur, Texte)
    
  EndProcedure
  
  Procedure.i MonBouton_Bascule(Gadget, x, y, Largeur, Hauteur, Texte.s)
    ; bouton bascule
    DefinirModele(#Prop_Type, #Type_Bascule)
    DefinirModele(#Prop_Justif, #PB_Text_Center)
    
    ProcedureReturn Creer(Gadget, x, y, Largeur, Hauteur,Texte)
    
  EndProcedure
  
  Procedure.i MonBouton_Coche(Gadget, x, y, Largeur, Hauteur, Texte.s)
    ; bouton à cocher
    DefinirModele(#Prop_Justif, 0)
    DefinirModele(#Prop_Type, #Type_Coche)
    DefinirModele(#Prop_CoulFnd, #Red)
    
    ProcedureReturn Creer(Gadget, x, y, Largeur, Hauteur,Texte)
    
  EndProcedure
  
  Procedure.i MonBouton_Option(Gadget, x, y, Largeur, Hauteur, Texte.s)
    ; bouton option
    DefinirModele(#Prop_Justif, 0)
    DefinirModele(#Prop_Type, #Type_Radio)
    
    ProcedureReturn Creer(Gadget, x, y, Largeur, Hauteur,Texte)
    
  EndProcedure
  
  Procedure.i MonBouton_Plat(Gadget, x, y, Largeur, Hauteur, Texte.s)
    ; bouton plat carré sans rayon ni gradient
    DefinirModele(#Prop_Justif, 0)
    DefinirModele(#Prop_Gradient, 0)
    DefinirModele(#Prop_Rayon, 0)
    DefinirModele(#Prop_Type, #Type_Normal)
    
    ProcedureReturn Creer(Gadget, x, y, Largeur, Hauteur,Texte)
    
  EndProcedure
  
  
  Enumeration    
    #MenuItem_1
    #MenuItem_2
    #MenuItem_3
  EndEnumeration
  
  Define Btn1, Btn2, Btn3, Btn4, Btn5, Btn6, Btn7, mnu, gdt,img
  
  Procedure   AuClic_Btn1()
    MessageRequester("Au Clic","hé, je suis le bouton 1 et vous m'avez pressé!")
  EndProcedure
  
  If OpenWindow(0, 0, 0, 420, 360, "Bouton Canvas", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget)
    SetWindowColor(0,$FFFFFF)
    
    
    mnu = CreatePopupMenu(#PB_Any)
    If mnu
      MenuItem(#MenuItem_1, "Elément 1")
      MenuItem(#MenuItem_2, "Elément 2")
      MenuItem(#MenuItem_3, "Elément 3")
    EndIf
    
    Btn1 = Creer(#PB_Any, 10, 10, 200, 30,"Bouton 1", "bouton normal")
    Btn2 = MonBouton_Coche(#PB_Any, 10, 50, 350, 60,"Une GRANDE boîte à cocher")
    Btn3 = MonBouton_Option(#PB_Any, 10,120, 200, 30,"Option Désactivée")
    Btn4 = MonBouton_Bascule(#PB_Any, 10,160, 220, 30,"Option texte aligné à droite")
    Btn5 = MonBouton_Bascule(#PB_Any, 10,200, 200, 30,"Bascule ...")
    Btn6 = MonBouton_Deroulant(#PB_Any, 10,240, 200, 30, mnu,"Déroulant...")
    
    DefinirModele(#Prop_CoulFnd, $AA9C83)
    DefinirModele(#Prop_Rayon, 0)
    DefinirModele(#Prop_CoulBord, -1)
    
    Btn7 = Creer(#PB_Any, 10,280, 220, 30, "") ; bouton image   
    Btn8 = MonBouton_Plat(#PB_Any, 10, 320, 220, 30, "Et pourquoi pas un bouton plat ?")
    
    DefinirPropriete(Btn1, #Prop_Rayon,15)
    ; attacher une procédure à l'événement AuClic
    DefinirPropriete(Btn1, #Prop_AuClic, @AuClic_Btn1())
    
    DefinirPropriete(Btn2, #Prop_CoulBord, RGB(0, 0, 255))
    DefinirPropriete(Btn2, #Prop_CoulFnd, RGB(84, 227, 209))
    DefinirPropriete(Btn2, #Prop_Justif, #PB_Text_Center)
    DefinirPropriete(Btn2, #Prop_Police, LoadFont(#PB_Any, "Verdana", 14, #PB_Font_Bold))
    
    Activer(Btn3, #False)
    DefinirPropriete(Btn3, #Prop_Coche_, #True)
    
    DefinirPropriete(Btn4, #Prop_Type, #Type_Radio)    ; modification du type par la suite ...
    DefinirPropriete(Btn4, #Prop_Coche_, #True)
    DefinirPropriete(Btn4, #Prop_Justif, #PB_Text_Right)
    DefinirPropriete(Btn4, #Prop_CoulTxt, $FFFFFF)
    DefinirPropriete(Btn4, #Prop_Gradient,90)
    
    DefinirPropriete(Btn6, #Prop_CoulFnd, $9AD968)
    DefinirPropriete(Btn6, #Prop_CoulBord, $72C431)
    DefinirPropriete(Btn6, #Prop_Rayon, 0)
    
    img = LoadImage(#PB_Any, #PB_Compiler_Home + "Examples/3D/Data/PureBasic3DLogo.png")
    DefinirPropriete(Btn7, #Prop_Type, #Type_Normal)
    DefinirPropriete(Btn7, #Prop_Image, img)
    DefinirPropriete(Btn7, #Prop_FaireTenirImage, #True)
    
    DefinirPropriete(Btn8, #Prop_Type, #Type_Bascule)
    DefinirPropriete(Btn8, #Prop_CoulFnd, $50FFFF)
    DefinirPropriete(Btn8, #Prop_CoulTxt, $FF0000)
    
    Repeat 
      Select WaitWindowEvent()
        Case #PB_Event_SizeWindow
          Redimensionner(btn2, #PB_Ignore,#PB_Ignore, WindowWidth(0) - 220, #PB_Ignore)
          Redimensionner(btn4, #PB_Ignore,#PB_Ignore, WindowWidth(0) - 220, #PB_Ignore)
          Redimensionner(btn7, #PB_Ignore,#PB_Ignore, WindowWidth(0) - 220, #PB_Ignore)
        Case #PB_Event_Menu
          Select EventMenu()
            Case #MenuItem_1 : Debug " Article menu 1"
            Case #MenuItem_2 : Debug " Article menu 2"
            Case #MenuItem_3 : Debug " Article menu 3"
          EndSelect
          
        Case #PB_Event_CloseWindow
          End
      EndSelect
    ForEver
    
  EndIf
  
CompilerEndIf