Page 1 sur 1

trackbar "sous la souris"

Publié : sam. 20/août/2005 0:58
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

Publié : sam. 20/août/2005 8:18
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:

Publié : sam. 20/août/2005 9:21
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

Publié : sam. 20/août/2005 13:32
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

Publié : sam. 20/août/2005 13:36
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

Publié : ven. 02/sept./2005 13:36
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