Page 1 sur 1

Min TrackBarGadget

Publié : lun. 22/août/2005 12:38
par lionel_om
Lors de la création d'un trackBarGadget, la valeur Min est ignorée et le min est sans cesse fixé à 0

Code : Tout sélectionner

#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)
    If GadgetWidth(nBar) > GadgetHeight(nBar)
      curPos\x = curPos\x - (WindowX() + GadgetX(nBar)+10)
      SetGadgetState(nBar, ((curPos\x) * (GetMinTB(nBar)+GetMaxTB(nBar))) / (GadgetWidth(nBar)-20))
    Else
      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, (GetMinTB(nBar)+GetMaxTB(nBar)) - ((curPos\y) * (GetMinTB(nBar)+GetMaxTB(nBar))) / (GadgetHeight(nBar)-20))
    EndIf
    UseWindow(GetDlgCtrlID_(curWin)) ; On rend le focus à la fenetre
  Else
    Debug "gad/win not initialized"
  EndIf

EndProcedure



  If OpenWindow(0,0,0,320,200,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"CheckBoxGadget") And CreateGadgetList(WindowID(0))
    TrackBarGadget(0, 10, 40,250, 20,-100,100)
    SetGadgetState(0, 50)

    Debug GetMinTB(0)
    Debug GetMaxTB(0)
    
    ; ----------------
    ;    Correction
    ; SetMinTB(0,-100)
    ; Debug GetMinTB(0)
    ; Debug GetMaxTB(0)
    ; SetGadgetState(0, 50) ; Mettre en commentaire le SetGadgetState() au dessus
    ; ----------------
    
    Repeat
    
    Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf
Pour réparer ce probl, enlever les commentaires

Publié : lun. 22/août/2005 15:56
par Fred
La valeur min/maxi doit etre comprise entre 0 et 10000 (comme spécifié dans la doc).

Publié : lun. 22/août/2005 20:08
par Dr. Dri
en cherchant des infos sur le min/max du spingadget j'ai vu que le 'range' était de 32bits maintenant...
j'ai été voir les progress et track bar et c'est la même chose. il est dit que le 16bits pour ces gadgets est obsolète. Pourquoi avoir choisi 10000 comme maximum ?

pour le minimum à 0 je veux bien comprendre... (d'ailleurs facilement émulable < 0) mais le maximum sort d'où ? décision arbitraire ? compatibilité entre les différents OS ?
parce que même en 16bits signé on doit pouvoir les dépasser ces 10000

d'ailleurs en fouillant encore sur le msdn le 32bits range couvre toute la plage d'un entier long signé!

Code : Tout sélectionner

Debug #MINLONG
Debug #MAXLONG
Dri :?:

Publié : mar. 23/août/2005 8:34
par lionel_om
Fred a écrit :La valeur min/maxi doit etre comprise entre 0 et 10000 (comme spécifié dans la doc).
:oops: J'avais pas vu :oops:
Mais on arrive quand mm (via l'API) à mettre une valeur négative pour le min (et donc sans doute pour le max). DOnc pourquoi pas le rajouter ???
Dri a écrit :pour le minimum à 0 je veux bien comprendre... (d'ailleurs facilement émulable < 0)
J'comprend pas ! :oops:

Publié : mar. 23/août/2005 10:17
par Fred
C'est effectivement parce que sous les 'vieux' Windows, le PBM_SETRANGE32 n'est pas dispo: http://msdn.microsoft.com/library/defau ... trange.asp

C'est un choix, pour etre compatible au maximum. De plus c'est un élément graphique, donc il faudrait un ecran de 10 000 pixels de large pour en tirer completement partie (c'est facile de faire un compteur sur 32 bits et de le ramener dans la plage 0-10000 pour l'affichage).

Publié : mar. 23/août/2005 11:44
par lionel_om
Bah c'est compatible à partir de Win95, donc je ne voispas le pb (sauf si j'ai mal compris). Car je pense que y'a plus personne qu'à Win 3.1 ?!!! :lol:

Publié : mar. 23/août/2005 13:15
par Progi1984
Si moi !

Publié : mar. 23/août/2005 13:23
par Dr. Dri
Et y'a toujours l'émulateur de windows 3.11 sur windows (démarrer -> exécuter -> progman)

Dri ;)