SplitterScrolling(Gadget.i)

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Jacobus
Messages : 1629
Inscription : mar. 06/avr./2004 10:35
Contact :

SplitterScrolling(Gadget.i)

Message par Jacobus »

Hello, voici un petit exemple d'interactions de plusieurs gadgets entre eux.
Ici c'est la commande d'un SplitterGadget() autrement qu'avec la barre de séparation.
Voilà, si ça peut vous servir, faites en bon usage :)

Code : Tout sélectionner

;-TOP
;======================================
; SplitterScrolling(Gadget.i)
;
; Interaction de plusieurs gadgets
; Chacun des 4 gadgets commande les 3 autres
;
; Le programme consiste à commander un SplitterGadget() de plusieurs manières.
; et indirectement à commander TrackBarGadget() et SpinGadget() de plusieurs manières aussi.
;
; Jacobus 23/05/2026 PB 6.40
; Windows 11 64bits
;======================================

Enumeration
  #WIN
  #Bouton1   
  #Bouton2 
  #Separator
  #Adjustmentbar 
  #TextSplit
  #TextLevel
  #TextSpinUnite
  #SpinUnite
  #TextSpinTen
  #SpinTen
EndEnumeration

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = Height/100          
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
  
  If Gadget = #Adjustmentbar
    TrackbarLevel = GetGadgetState(#Adjustmentbar)
    SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#SpinUnite, TrackbarLevel)
    SetGadgetState(#SpinTen, TrackbarLevel)
    
  ElseIf Gadget = #SpinUnite
    Spinlevel = GetGadgetState(#SpinUnite)
    SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
    SetGadgetState(#SpinTen, Spinlevel)
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#Adjustmentbar, Spinlevel)
    
  ElseIf Gadget = #SpinTen
    SpinTlevel = GetGadgetState(#SpinTen)
    SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
    SetGadgetState(#Adjustmentbar, SpinTlevel)
    SetGadgetState(#SpinUnite, SpinTlevel)
    
  ElseIf Gadget = #Separator
    Splitlevel = GetGadgetState(#Separator)
    SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
    SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
    SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
    TrackbarLevel = GetGadgetState(#Adjustmentbar)
    SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
    SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
  EndIf 

EndProcedure

If OpenWindow(#WIN, 0, 0, 300, 300, "SplitterGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         
    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separator, 5, 5, 290, 130, #Bouton1, #Bouton2, #PB_Splitter_Separator)
    
    TrackBarGadget(#Adjustmentbar, 5, 140, 290, 20, 0, 100) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#Adjustmentbar, 50) ; mise à 50% au départ
    
    TextGadget(#TextSpinUnite, 5, 170, 45, 20, "Unité :") ;les ajustements seront précis de 1 en 1
    SpinGadget(#SpinUnite, 50, 170, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinUnite, 50)
    
    TextGadget(#TextSpinTen, 120, 170, 45, 20, "Dizaine :") ;les ajustements seront moins précis mais plus rapide de 10 en 10
    SpinGadget(#SpinTen, 170, 170, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinTen, 50)
    
    TextGadget(#TextSplit, 5, 200, 290, 20, "Splitter position = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator))+ " pixels")
    
    TextGadget(#TextLevel, 5, 225, 290, 20, "Level = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar))+ " %")
    
    Repeat 
      Event = WaitWindowEvent()
      Select Event
          
        Case #PB_Event_Gadget
          
          Select EventGadget()
              
;             Case #Bouton1 : Debug "Bouton 1 cliqué !"
;               
;             Case #Bouton2 : Debug "Bouton 2 cliqué !"
              
            Case #Separator     : SplitterScrolling(#Separator)
              
            Case #Adjustmentbar : SplitterScrolling(#Adjustmentbar)
              
            Case #SpinUnite     : SplitterScrolling(#SpinUnite)

            Case #SpinTen ;{
              SpinTen = GetGadgetState(#SpinTen)-1      ;on retire 1 du spin auto
              If EventType() = #PB_EventType_Up         ;Le bouton 'Haut' a été pressé.
                SetGadgetState(#SpinTen, SpinTen + 10)  ;on augmente de 10 pour avoir un pas d'une dizaine
              ElseIf EventType() = #PB_EventType_Down   ;Le bouton 'Bas' a été pressé.
                SetGadgetState(#SpinTen, SpinTen - 10)  ;on retire 10
              EndIf 
              SplitterScrolling(#SpinTen) ;application du pourcentage
              ;}
              
          EndSelect
          
        Case #PB_Event_CloseWindow
          Select EventWindow()     
            Case #WIN : Quit = 1                     
          EndSelect
          
      EndSelect
      
    Until Quit = 1
    End 
  EndIf
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Jacobus
Messages : 1629
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: SplitterScrolling(Gadget.i)

Message par Jacobus »

Petite mise à jour du code et ajout de l'option d'utilisation des flèches du clavier pour monter ou descendre le séparateur du SplitterGadget() :)

Code : Tout sélectionner

;;-TOP
;======================================
; SplitterScrolling(Gadget.i)
; Jacobus 23/05/2026 PB 6.40 (x64)
; Windows 11 64bits
;
; Interaction de plusieurs gadgets
; Chacun des 4 gadgets commande les 3 autres
;
; Le programme consiste à commander un SplitterGadget() de plusieurs manières.
; et indirectement à commander TrackBarGadget() et SpinGadget() de plusieurs manières aussi.
;
; 24/05/2026
; Ajout de 2 boutons Up & Down avec icône et raccourcis clavier flèche haut et flèche bas. Unité par unité.
; pour commander la montée et la descente du séparateur + interactions avec les autres gadgets.
; Ajout de 2 boutons Up & Down avec icône et texte pour monter ou descendre complètement le splitter.
;======================================
;-Constantes
Enumeration Fenetres
  #WIN
EndEnumeration

Enumeration Gadgets 
  #Bouton1   
  #Bouton2 
  #Separator
  #Adjustmentbar 
  #TextSplit
  #TextLevel
  #TextSpinUnite
  #SpinUnite
  #TextSpinTen
  #SpinTen
  #Btn_Up
  #Btn_Down
  #Btn_highposition
  #Btn_lowposition
EndEnumeration

Enumeration Menus
  #ShortCut_Menu_Up
  #ShortCut_Menu_Down
EndEnumeration

Procedure SplitterScrolling(Gadget.i)
  ; Dans cette procédure tous les gadgets vont être en interaction
  ; Pour adapter le pourcentage aux autres gadgets
  ; il est nécessaire de diviser la hauteur du SplitterGadegt() par 100
  ; Pour un splitter vertical il faudrait biensûr diviser la largeur par 100
  Height = GadgetHeight(#Separator) 
  Unite.f = Height/100     ; 1/100 ème de la hauteur du gadget       
  UniteF$ = StrF(Unite, 2) ; important de prendre 2 chiffres après la virgule pour un ajustement précis
  
  Select Gadget
      
    Case #Adjustmentbar
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetState(#Separator, TrackbarLevel * ValF(UniteF$)) ; on multiplie le niveau de la trackbar par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#SpinUnite, TrackbarLevel)
      SetGadgetState(#SpinTen, TrackbarLevel)
      
    Case #SpinUnite
      Spinlevel = GetGadgetState(#SpinUnite)
      SetGadgetState(#Separator, Spinlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      SetGadgetState(#SpinTen, Spinlevel)
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(Spinlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, Spinlevel)
      
    Case #SpinTen
      SpinTlevel = GetGadgetState(#SpinTen)
      SetGadgetState(#Separator, SpinTlevel * ValF(UniteF$)) ; on multiplie le niveau du spingadget par l'unité obtenue
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetText(#TextLevel, "Level = "+Str(SpinTlevel) + " %")
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetState(#Adjustmentbar, SpinTlevel)
      SetGadgetState(#SpinUnite, SpinTlevel)
      
    Case #Separator
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      TrackbarLevel = GetGadgetState(#Adjustmentbar)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(TrackbarLevel) + " %")
      
    Case #Btn_Up
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel - ValF(UniteF$)) ; on retire l'unité obtenue pour monter la barre      
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_Down
      Splitlevel = GetGadgetState(#Separator)
      SetGadgetState(#Separator, Splitlevel + ValF(UniteF$)) ; on ajoute l'unité obtenue pour descendre la barre      
      SetGadgetState(#SpinUnite, Splitlevel/ValF(UniteF$)) ; par contre ici on est obligé de diviser la valeur du splittergadget par l'unité obtenue
      SetGadgetState(#SpinTen, Splitlevel/ValF(UniteF$))
      SetGadgetState(#Adjustmentbar, Splitlevel/ValF(UniteF$))
      SetGadgetText(#TextSplit, "Splitter position = "+Str(Splitlevel) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_highposition
      SetGadgetState(#Separator,     0)
      SetGadgetState(#SpinUnite,     0)
      SetGadgetState(#SpinTen,       0)
      SetGadgetState(#Adjustmentbar, 0)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
    Case #Btn_lowposition
      SetGadgetState(#Separator,     100 * ValF(UniteF$))
      SetGadgetState(#SpinUnite,     100) 
      SetGadgetState(#SpinTen,       100)
      SetGadgetState(#Adjustmentbar, 100)
      SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator)) + " pixels")
      SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar)) + " %")
      
  EndSelect  

EndProcedure

;-Fenêtre
If OpenWindow(#WIN, 0, 0, 300, 300, "SplitterScrolling", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
         
    ButtonGadget(#Bouton1, 0, 0, 0, 0, "Bouton 1") ; Inutile de préciser la taille ou les coordonnées
    ButtonGadget(#Bouton2, 0, 0, 0, 0, "Bouton 2") ; car elles seront déterminées automatiquement
    SplitterGadget(#Separator, 5, 5, 290, 130, #Bouton1, #Bouton2, #PB_Splitter_Separator)
    
    TrackBarGadget(#Adjustmentbar, 5, 140, 290, 20, 0, 100) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#Adjustmentbar, 50) ; mise à 50% au départ
    
    TextGadget(#TextSpinUnite, 5, 165, 45, 20, "Unité :") ;les ajustements seront précis de 1 en 1
    SpinGadget(#SpinUnite, 50, 165, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinUnite, 50)
    
    TextGadget(#TextSpinTen, 5, 190, 45, 20, "Dizaine :") ;les ajustements seront moins précis mais plus rapide de 10 en 10
    SpinGadget(#SpinTen, 50, 190, 50, 20, 0, 100, #PB_Spin_Numeric) ;de 0 à 100 pour établir un niveau de pourcentage
    SetGadgetState(#SpinTen, 50)
    
    ButtonImageGadget(#Btn_Up, 133, 160, 35, 25, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",246))
    GadgetToolTip(#Btn_Up,"Monter le séparateur, unité par unité")
    
    ButtonImageGadget(#Btn_Down, 133, 185, 35, 25, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll",247))
    GadgetToolTip(#Btn_Down,"Descendre le séparateur, unité par unité")
    
    ButtonGadget(#Btn_highposition,200, 160, 90, 25,Space(2)+"En haut") 
    SetWindowLongPtr_(GadgetID(#Btn_highposition), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Btn_highposition), #GWL_STYLE) |#BS_LEFT)
    SendMessage_(GadgetID(#Btn_highposition), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 246))
    GadgetToolTip(#Btn_highposition,"Séparateur tout en haut, affichage bouton 2")
    
    ButtonGadget(#Btn_lowposition,200, 185, 90, 25,Space(2)+"En bas") 
    SetWindowLongPtr_(GadgetID(#Btn_lowposition), #GWL_STYLE, GetWindowLongPtr_(GadgetID(#Btn_lowposition), #GWL_STYLE) |#BS_LEFT)
    SendMessage_(GadgetID(#Btn_lowposition), #BM_SETIMAGE, #IMAGE_ICON, ExtractIcon_(GetModuleHandle_(#Null), "Shell32.dll", 247)) 
    GadgetToolTip(#Btn_lowposition,"Séparateur tout en bas, affichage bouton 1")
    
    TextGadget(#TextSplit, 5, 220, 290, 20, "Splitter position = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextSplit, "Splitter position = "+Str(GetGadgetState(#Separator))+ " pixels")
    
    TextGadget(#TextLevel, 5, 250, 290, 20, "Level = ",#PB_Text_Border|#PB_Text_Center)   
    SetGadgetText(#TextLevel, "Level = "+Str(GetGadgetState(#Adjustmentbar))+ " %")
        
    AddKeyboardShortcut(#WIN, #PB_Shortcut_Up,   #ShortCut_Menu_Up)
    AddKeyboardShortcut(#WIN, #PB_Shortcut_Down, #ShortCut_Menu_Down)
                                            
   
    Repeat 
      Event = WaitWindowEvent()
      Select Event
          
      ;-Event Menus     
        Case #PB_Event_Menu
          
          Select EventMenu()
              
            Case #ShortCut_Menu_Up   : SplitterScrolling(#Btn_Up)
              
            Case #ShortCut_Menu_Down : SplitterScrolling(#Btn_Down)
              
          EndSelect
          
      ;-Event Gadgets     
        Case #PB_Event_Gadget
            
          Select EventGadget()
              
            Case #Bouton1 : Debug "Bouton 1 cliqué !"
              
            Case #Bouton2 : Debug "Bouton 2 cliqué !"
              
            Case #Separator     : SplitterScrolling(#Separator)
              
            Case #Adjustmentbar : SplitterScrolling(#Adjustmentbar)
              
            Case #SpinUnite     : SplitterScrolling(#SpinUnite)

            Case #SpinTen ;{
              SpinTen = GetGadgetState(#SpinTen)-1      ;on retire 1 du spin auto
              If EventType() = #PB_EventType_Up         ;Le bouton 'Haut' a été pressé.
                SetGadgetState(#SpinTen, SpinTen + 10)  ;on augmente de 10 pour avoir un pas d'une dizaine
              ElseIf EventType() = #PB_EventType_Down   ;Le bouton 'Bas' a été pressé.
                SetGadgetState(#SpinTen, SpinTen - 10)  ;on retire 10
              EndIf 
              SplitterScrolling(#SpinTen) ;application du pourcentage
                                          ;}
              
            Case #Btn_Up   : SplitterScrolling(#Btn_Up)
              
            Case #Btn_Down : SplitterScrolling(#Btn_Down)
              
            Case #Btn_highposition : SplitterScrolling(#Btn_highposition)
              
            Case #Btn_lowposition  : SplitterScrolling(#Btn_lowposition)
              
          EndSelect
     ;-Close window     
        Case #PB_Event_CloseWindow
          Select EventWindow()     
            Case #WIN : Quit = 1                     
          EndSelect
          
      EndSelect
      
    Until Quit = 1
    End 
  EndIf
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre