Bouton à bascule

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Bouton à bascule

Message par Programmes »

Bonjour à tous,
Est-il possible avec Purebasic de créer un button toggle de ce type:
Image
Merci à tous ...
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Bouton à bascule

Message par falsam »

Oui avec l'option Toogle

Code : Tout sélectionner

If OpenWindow(0, 0, 0, 222, 200, "ButtonGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    ButtonGadget(0, 10, 10, 200, 20, "Bouton à bascule1")
    ButtonGadget(1, 10, 40, 200, 20, "Bouton à bascule2")
    ButtonGadget(4, 10,170, 200, 20, "Toggle Button", #PB_Button_Toggle)
    SetGadgetState(4, #True)
    
    Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  EndIf
Si tu veux la même visualisation que ton exemple, désactive le support des thémes visuel XP sans les options de compilations.

PS : Modérateur si tu passes par là, bascule ce sujet dans la section débutant :)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Re: Bouton à bascule

Message par Programmes »

Désolé, je l'ai vu en l'envoyant que je n'étais pas dans la bonne section!
Merci pour l'info, je viens de tester, c'est OK!
Bonne fin de journée...A +
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Bouton à bascule

Message par Micoute »

Code : Tout sélectionner

;Interupteur.pbi

Structure PB_Interrupteur
  Type.l
  Taille.l
  Rappel.i
  Liberation.i
  ObtenirEtat.i
  DefinirEtat.i
EndStructure

ImportC "" 
  PB_Event_AddWithData(a,b,c,d,e,f)   
EndImport

; Faites vos propres constantes
Enumeration 
  #CHANGER_ETAT = #WM_USER
  #OBTENIR_ETAT
  #DEFINIR_ETAT
EndEnumeration

Structure Rect2
  Gauche.l
  Haut.l
  Droite.l
  Bas.l
EndStructure


Structure MonGadget
  IdGadget.i
  AncProc.i
  Etat.i
  Couleur.i
EndStructure

Procedure Interrupteur__ObtenirEtat(*IdGadget.integer)
  ProcedureReturn SendMessage_(*IdGadget\i, #OBTENIR_ETAT, 0, 0)
EndProcedure

Procedure Interrupteur__DefinirEtat(*IdGadget.integer, Etat)   
  SendMessage_(*IdGadget\i, #DEFINIR_ETAT, 0, Etat)   
EndProcedure

Procedure MonGadgetProc(hWnd, Msg, wParam, lParam)
  Protected *mg.MonGadget = GetWindowLongPtr_(hWnd, #GWLP_USERDATA)
  Protected x , y, hdc, rect.Rect2
  Protected Proc
  
  proc = *mg\AncProc
  
  If Msg = #WM_PAINT
    
    hdc = StartDrawing(CanvasOutput(*mg\IdGadget))
    
    If *mg\Etat = 0            
      *mg\Couleur = $7779E9
    Else
      *mg\Couleur = $9CE3AA
    EndIf
    
    Box(0, 0, GadgetWidth(*mg\IdGadget), GadgetHeight(*mg\IdGadget), *mg\Couleur)
    
    Rect\Droite = GadgetWidth(*mg\IdGadget)
    
    Rect\Bas = GadgetHeight(*mg\IdGadget) 
    
    DrawEdge_(hdc, Rect, #BDR_SUNKENINNER, #BF_RECT)
    
    If *mg\Etat = 0
      Rect\Droite = GadgetWidth(*mg\IdGadget)  / 2            
    Else
      Rect\Gauche  = GadgetWidth(*mg\IdGadget) / 2      
      Rect\Droite = GadgetWidth(*mg\IdGadget)  / 2 + Rect\Gauche         
    EndIf
    
    Rect\Gauche + 1
    Rect\Haut   = 1
    Rect\Bas    - 1
    
    DrawFrameControl_(hdc, Rect, #DFC_BUTTON, #DFCS_BUTTONPUSH)
    
    StopDrawing()
  EndIf
  
  If Msg = #OBTENIR_ETAT
    ProcedureReturn *mg\Etat
  EndIf
  
  If Msg = #DEFINIR_ETAT
    *mg\Etat = lparam
    SendMessage_(hWnd, #WM_PAINT, 0, 0)   
  EndIf   
  
  If Msg = #WM_LBUTTONDBLCLK;#WM_LBUTTONUP      
    *mg\Etat ! 1      
    PB_Event_AddWithData($332C, *mg\IdGadget, 0, #PB_EventType_Change, 0, 0)      
    SendMessage_(hWnd, #WM_PAINT, 0, 0)      
  EndIf      
  
  If Msg = #WM_DESTROY
    SetWindowLongPtr_(hWnd, #GWLP_WNDPROC, proc)
    FreeMemory(*mg)
  EndIf
  
  ProcedureReturn CallWindowProc_(Proc, hWnd, Msg, wParam, lParam)
EndProcedure


Procedure MonGadget(id, x, y, largeur, hauteur)
  
  Protected gadget
  Protected *mg.MonGadget
  Protected *Interrupteur.PB_Interrupteur
  
  *mg = AllocateMemory(SizeOf(MonGadget))
  
  gadget = CanvasGadget(id, x, y, largeur, hauteur, #PB_Canvas_Keyboard | #PB_Canvas_ClipMouse)
  
  If id = #PB_Any
    *mg\IdGadget = gadget
  Else
    *mg\IdGadget = id
  EndIf   
  
  ;Stocker des données dans le gadget
  SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_USERDATA, *mg)
  
  ;Rappel
  *mg\AncProc = SetWindowLongPtr_(GadgetID(*mg\IdGadget), #GWLP_WNDPROC, @MonGadgetProc())
  
  ;Ensemble de ObtenirEtat et DefinirEtat
  *Interrupteur = PeekI(IsGadget(*mg\IdGadget) + SizeOf(Integer))
  
  *Interrupteur\ObtenirEtat    = @Interrupteur__ObtenirEtat()   
  *Interrupteur\DefinirEtat    = @Interrupteur__DefinirEtat()
  
  ProcedureReturn gadget
EndProcedure
Test interrupteur.pb

Code : Tout sélectionner

XIncludeFile "Interrupteur.pbi"
;***TEST***
#NbrInter = 10

Enumeration Fenetre
  #Fenetre_principale
EndEnumeration

Enumeration Gadgets
  #Inter_0
  #Inter_1
  #Inter_2
  #Inter_3
  #Inter_4
  #Inter_5
  #Inter_6
  #Inter_7
  #Inter_8
  #Inter_9
  #Txt_0
  #Txt_1
  #Txt_2
  #Txt_3
  #Txt_4
  #Txt_5
  #Txt_6
  #Txt_7
  #Txt_8
  #Txt_9
  #TxtInfo
EndEnumeration

Macro MonInter(NumInter, X ,Y)
  MonGadget(NumInter, X, Y, largeurInter, HauteurInter)
EndMacro

Macro MonTexte(IdGadget, NumInter)
  TextGadget(IdGadget, GadgetX(NumInter)+LargeurInter + 20, HauteurInter / 4 + GadgetY(NumInter), 30, 20, "")
EndMacro 

Procedure Ouvrir_Fenetre_principale()
  
  Protected gadget
  Protected event
  Protected.i LargeurInter = 70, HauteurInter = 40
  
  OpenWindow(#Fenetre_principale, 0, 0, 280, 280, "Interrupteurs", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)   
    
  MonInter(#Inter_0, 10, 10)
  MonInter(#Inter_1, 10, GadgetY(#Inter_0) + GadgetHeight(#Inter_0) + 10)
  MonInter(#Inter_2, 10, GadgetY(#Inter_1) + GadgetHeight(#Inter_1) + 10)
  MonInter(#Inter_3, 10, GadgetY(#Inter_2) + GadgetHeight(#Inter_2) + 10)
  MonInter(#Inter_4, 10, GadgetY(#Inter_3) + GadgetHeight(#Inter_3) + 10)
  
  MonInter(#Inter_5, GadgetX(#Inter_0) + 130, GadgetY(#Inter_0))
  MonInter(#Inter_6, GadgetX(#Inter_1) + 130, GadgetY(#Inter_1))
  MonInter(#Inter_7, GadgetX(#Inter_2) + 130, GadgetY(#Inter_2))
  MonInter(#Inter_8, GadgetX(#Inter_3) + 130, GadgetY(#Inter_3))
  MonInter(#Inter_9, GadgetX(#Inter_4) + 130, GadgetY(#Inter_4))
  
  MonTexte(#Txt_0, #Inter_0)
  MonTexte(#Txt_1, #Inter_1)
  MonTexte(#Txt_2, #Inter_2)
  MonTexte(#Txt_3, #Inter_3)
  MonTexte(#Txt_4, #Inter_4)
  
  Montexte(#Txt_5, #Inter_5)
  Montexte(#Txt_6, #Inter_6)
  Montexte(#Txt_7, #Inter_7)
  Montexte(#Txt_8, #Inter_8)
  Montexte(#Txt_9, #Inter_9)
  
  TextGadget(#TxtInfo, 10, 260, 260, 15, "Double-cliquer pour changer l'état d'un interrupteur")
  
  SetGadgetState(#Inter_0, #False)
  SetGadgetState(#Inter_1, #True)
  SetGadgetState(#Inter_2, #True)
  SetGadgetState(#Inter_3, #False)
  SetGadgetState(#Inter_4, #True)  
  SetGadgetState(#Inter_5, #True)
  SetGadgetState(#Inter_6, #False)
  SetGadgetState(#Inter_7, #False)
  SetGadgetState(#Inter_8, #True)
  SetGadgetState(#Inter_9, #False)
  
  For i = 0 To 9
    If GetGadgetState(i) = #True
      SetGadgetText(i+10, "Ouvert")
    Else
      SetGadgetText(i+10, "Fermé")
    EndIf
  Next i  
  
  Repeat
    
    event = WaitWindowEvent()
    
    If event = #PB_Event_CloseWindow
      Break
    EndIf
    
    If event = #PB_Event_Gadget
      
      If EventType() = #PB_EventType_Change
        Select EventGadget()
          Case #Inter_0 To #NbrInter
            If GetGadgetState(EventGadget())
              SetGadgetText(EventGadget() + 10, "Ouvert")
            Else
              SetGadgetText(EventGadget() + 10, "Fermé")
            EndIf          
        EndSelect            
      EndIf
      
    EndIf      
    
  ForEver
  
EndProcedure

Ouvrir_Fenetre_principale()
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre