Min TrackBarGadget

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

Min TrackBarGadget

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message par Fred »

La valeur min/maxi doit etre comprise entre 0 et 10000 (comme spécifié dans la doc).
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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 :?:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Fred
Site Admin
Messages : 2808
Inscription : mer. 21/janv./2004 11:03

Message 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).
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Si moi !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Et y'a toujours l'émulateur de windows 3.11 sur windows (démarrer -> exécuter -> progman)

Dri ;)
Répondre