trackbar "sous la souris"

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

trackbar "sous la souris"

Message par Dr. Dri »

je bosse avec une trackbar et quand je ne clique pas sur le curseur, le curseur se rapproche de la souris...

je voudrais modifier ce comportement à la manière du windows media player (mplayer2.exe) à savoir que je peux cliquer où je veux, le curseur se met automatiquement sous la souris...

Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Faut peut être faire ça en utilisant les cordonnées souris, de la fenêtre et de la position de la TrackBar.

Je vais devoir utiliser ce système donc je vais y travailler aussi de mon côté.
Je te passerai le fruiit de mon taffe :wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Code : Tout sélectionner

Enumeration
  #WIN
  #TRACK
  #OPT
EndEnumeration



Procedure.l GetMinTB(nBar.l)
  If IsGadget(nBar)
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_GETRANGEMIN, 0, 0)
  EndIf
EndProcedure

Procedure.l GetMaxTB(nBar.l)
  If IsGadget(nBar)
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_GETRANGEMAX, 0, 0)
  EndIf
EndProcedure

Procedure SetMinTB(nBar.l, val.l)
  If IsGadget(nBar)
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_SETRANGEMIN, 0, val)
  EndIf
EndProcedure

Procedure SetMaxTB(nBar.l, val.l)
  If IsGadget(nBar)
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_SETRANGEMAX, 0, val)
  EndIf
EndProcedure


Procedure ReplaceTrackBarCursor(nBar.l, nWin.l)
  Protected curPos.Point, curWin.l

  ; On enregistre la fenetre courante
    curWin = WindowID()
  
  GetCursorPos_(curPos)
  
  If IsWindow(nWin) And IsGadget(nBar)
    UseWindow(nWin)
    curPos\x = curPos\x - (WindowX() + GadgetX(nBar))
    SetGadgetState(nBar, ((curPos\x-6) * (GetMinTB(nBar)+GetMaxTB(nBar))) / (GadgetWidth(nBar)-12))
    UseWindow(GetDlgCtrlID_(curWin)) ; On rend le focus à la fenetre
  Else
    Debug "gad/win not initialized"
  EndIf

EndProcedure





If OpenWindow(#WIN,0,0,320,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"CheckBoxGadget") And CreateGadgetList(WindowID())
  TrackBarGadget(#TRACK, 10, 40,250, 20,0,10000)
  SetGadgetState(#TRACK, 100)
  CheckBoxGadget(#OPT, 10, 60,250, 20,"Activer l'aide") 
  
curPos.Point  
  
  Repeat
    EventID = WaitWindowEvent()
  
    If EventID = #PB_Event_Gadget
    
      Select EventGadgetID()
      
        Case #TRACK
          If GetGadgetState(#OPT)
            ReplaceTrackBarCursor(#TRACK, #WIN)
          EndIf
        ;EndCase
      
      EndSelect
      
    EndIf

  Until EventID=#PB_Event_CloseWindow
EndIf

Par contre ce n'ai plus fiable s'il y a des PanelsGadgets(), ScrollAreaGadget() ou autres gadgets qui déplacent la postion de la trackBar.

Moi j'aurai pas ce pb dans mon lecteur MP3, donc je vais me servir de ce code.

Si tu trouve une autre voie, fais en moi part :wink:


Ya une cmd pr récupérer le num d'un type de gadget ? pr savoir si un gadget est une trackBar, un bouton, etc...
merci
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

je crois k'on peut récupérer la classe du gadget (chaine de caractere) via l'api windows en donnant son handle

je teste ton code tout de suite

Dri
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Oui, merci Denis m'a répondu.
J'ai donc modifié le code :

Code : Tout sélectionner

Enumeration
  #WIN
  #TRACK
  #OPT
EndEnumeration

#Class_TrackBar = "msctls_trackbar32"


Procedure.s GetGadgetClass(hGadget.l)
  Protected Class.s
  Class = Space(255)
  GetClassName_(hGadget, @Class, 254)
  ProcedureReturn Class
EndProcedure


Procedure.l GetMinTB(nBar.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_GETRANGEMIN, 0, 0)
  EndIf
EndProcedure

Procedure.l GetMaxTB(nBar.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_GETRANGEMAX, 0, 0)
  EndIf
EndProcedure

Procedure SetMinTB(nBar.l, val.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_SETRANGEMIN, 0, val)
  EndIf
EndProcedure

Procedure SetMaxTB(nBar.l, val.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_SETRANGEMAX, 0, val)
  EndIf
EndProcedure


Procedure ReplaceTrackBarCursor(nBar.l, nWin.l)
  Protected curPos.Point, curWin.l

  ; On enregistre la fenetre courante
    curWin = WindowID()
  
  GetCursorPos_(curPos)
  
  If IsWindow(nWin) And IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    UseWindow(nWin)
    curPos\x = curPos\x - (WindowX() + GadgetX(nBar))
    SetGadgetState(nBar, ((curPos\x-6) * (GetMinTB(nBar)+GetMaxTB(nBar))) / (GadgetWidth(nBar)-12))
    UseWindow(GetDlgCtrlID_(curWin)) ; On rend le focus à la fenetre
  Else
    Debug "gad/win not initialized"
  EndIf

EndProcedure





If OpenWindow(#WIN,0,0,320,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"CheckBoxGadget") And CreateGadgetList(WindowID())
  TrackBarGadget(#TRACK, 10, 40,250, 20,0,10000)
  SetGadgetState(#TRACK, 100)
  CheckBoxGadget(#OPT, 10, 60,250, 20,"Activer l'aide") 
  
  
curPos.Point  
  
  Repeat
    EventID = WaitWindowEvent()
  
    If EventID = #PB_Event_Gadget
    
      Select EventGadgetID()
      
        Case #TRACK
          If GetGadgetState(#OPT)
            ReplaceTrackBarCursor(#TRACK, #WIN)
          EndIf
        ;EndCase
      
      EndSelect
      
    EndIf

  Until EventID=#PB_Event_CloseWindow
EndIf
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

J'ai rajouter deux petites fonctions (car je crois kelles ne sont pas par défaut dans PB :

Code : Tout sélectionner

Enumeration
  #WIN
  #TRACK1
  #TRACK2
  #OPT
  #BT1
  #BT2
EndEnumeration

#Class_TrackBar = "msctls_trackbar32"


Procedure.s GetGadgetClass(hGadget.l)
  Protected Class.s
  Class = Space(255)
  GetClassName_(hGadget, @Class, 254)
  ProcedureReturn Class
EndProcedure



Procedure VerticalTrackBar(nBar.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    SetWindowLong_(GadgetID(nBar), #GWL_STYLE, GetWindowLong_(GadgetID(nBar), #GWL_STYLE) | 2)
  EndIf
EndProcedure


Procedure HorizontalTrackBar(nBar.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    SetWindowLong_(GadgetID(nBar), #GWL_STYLE, GetWindowLong_(GadgetID(nBar), #GWL_STYLE) & ~2)
  EndIf
EndProcedure



Procedure.l GetMinTB(nBar.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_GETRANGEMIN, 0, 0)
  EndIf
EndProcedure

Procedure.l GetMaxTB(nBar.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    ProcedureReturn SendMessage_(GadgetID(nBar), #TBM_GETRANGEMAX, 0, 0)
  EndIf
EndProcedure

Procedure SetMinTB(nBar.l, val.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    SendMessage_(GadgetID(nBar), #TBM_SETRANGEMIN, 0, val)
  EndIf
EndProcedure

Procedure SetMaxTB(nBar.l, val.l)
  If IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    SendMessage_(GadgetID(nBar), #TBM_SETRANGEMAX, 0, val)
  EndIf
EndProcedure




Procedure ReplaceTrackBarCursor(nBar.l, nWin.l)
  Protected curPos.Point, curWin.l, style.l

  curWin = WindowID() ; On enregistre la fenetre courante
  GetCursorPos_(curPos)
  
  If IsWindow(nWin) And IsGadget(nBar) And GetGadgetClass(GadgetID(nBar)) = #Class_TrackBar
    UseWindow(nWin)
    style = GetWindowLong_(GadgetID(nBar), #GWL_STYLE)
    If style & 2 ; ---- Verticale ----
      curPos\y = curPos\y - (WindowY() + GadgetY(nBar)+10)
      If GetWindowLong_(WindowID(), #GWL_STYLE) & #WS_POPUP <> #WS_POPUP
        curPos\y - 20; (pr la barre de titre)
      EndIf
      SetGadgetState(nBar, (GetMaxTB(nBar)-(curPos\y * (GetMaxTB(nBar)-GetMinTB(nBar))) / (GadgetHeight(nBar)-20))+GetMinTB(nBar) )
    Else ; --- Horizontale ---
      curPos\x = curPos\x - (WindowX() + GadgetX(nBar)+10)
      SetGadgetState(nBar, ((curPos\x * (GetMaxTB(nBar)-GetMinTB(nBar))) / (GadgetWidth(nBar)-20))+GetMinTB(nBar) )
    EndIf
    UseWindow(GetDlgCtrlID_(curWin)) ; On rend le focus à la fenetre
  Else
    Debug "gad/win not initialized or not a TrackBar"
  EndIf
EndProcedure




If OpenWindow(#WIN,0,0,320,200,#PB_Window_ScreenCentered | #PB_Window_SystemMenu,"CheckBoxGadget") And CreateGadgetList(WindowID())
  TrackBarGadget(#TRACK1, 10, 40,250, 20,0,10000)
  SetGadgetState(#TRACK1, 100)
  TrackBarGadget(#TRACK2, 10, 80, 100, 100,0,10000,#PB_TrackBar_Vertical)
  CheckBoxGadget(#OPT, 10, 60,250, 20,"Activer l'aide")
  ButtonGadget(#BT1, 130,120, 80,20, "Horizontal")
  ButtonGadget(#BT2, 130,150, 80,20, "Vertical")
  
  Repeat
    EventID = WaitWindowEvent()
  
    If EventID = #PB_Event_Gadget
    
      Select EventGadgetID()
      
        Case #TRACK1
          If GetGadgetState(#OPT)
            ReplaceTrackBarCursor(#TRACK1, #WIN)
          EndIf
        ;EndCase
        
        Case #TRACK2
          If GetGadgetState(#OPT)
            ReplaceTrackBarCursor(#TRACK2, #WIN)
          EndIf
        ;EndCase
        
        
        Case #BT1
          HorizontalTrackBar(#TRACK2)
        ;EndCase
        
        Case #BT2
          VerticalTrackBar(#TRACK2)
        ;EndCase
      
      EndSelect
      
    EndIf

  Until EventID=#PB_Event_CloseWindow
EndIf
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre