da mir die Trackbar vom Design her überhaupt nicht gefällt, habe ich versucht ein ProgressBarGadget dafür zu missbrauchen.
Funktioniert für mich eigentlich zufriedenstellend. Nur ein Problem bleibt natürlich ...
Ich brauche ein paar mehr dieser "Slider" und würde den Callback gerne universell benutzen können.
Das Problem besteht nun darin, das ich keine GadgetNr habe, nur die GadgetID(GadgetNr).
Get-/Setgadget fällt somit weg ... oder gibt es eine Möglichkeit (ohne Zwischenspeichern) die GadgetNr aus der GadgetID zu bekommen?
Vielleicht sitze ich auch einfach auf der leitung und es gibt eine ganz andere Möglichkeik ... sitze seit 2 Std. daran und drehe mich im Kreis.
Tante Google oder Onakel Yahoo waren auch nicht sehr hilfreich.
Code mit PB 5.31 / Win7 x86 getestet
Code: Alles auswählen
EnableExplicit
#PBM_GETPOS = #WM_USER + 8
Macro MAKELPARAM_(loWord, hiWord)
( hiWord << 16 | loWord )
EndMacro
Global ETCallBack
Define Null.w = 0
Procedure EventTypeCallbackH(PBar, Message, wParam, lParam)
Protected m.POINT
Protected oldX, X, Level, Gadget
;Gadget = EventGadget() ; Funktioniert NICHT
;wParam ist GadgetID(0) ... manchmal auch 0, 1 oder 18 ?
If Message = #WM_LBUTTONDOWN
;Level = SendMessage_(wParam, #PBM_GETPOS, 0, 0) ; liefert manchmal 0 oder weniger
Level = GetGadgetState(0)
GetCursorPos_(m)
oldX = m\x
While GetAsyncKeyState_(#VK_LBUTTON)
GetCursorPos_(m)
X = m\x
Level + (X - oldX)
If Level > 250
Level = 250
ElseIf level < 0
Level = 0
EndIf
SetGadgetState(0, Level)
;SendMessage_(wParam, #PBM_SETPOS, 0, MAKELPARAM_(0, Level)) ; funktioniert NICHT
oldX = X
SetWindowTitle(0, "ProgressSlider: " + Str(Int(GetGadgetState(0) / 2.5))) ; Nur zum testen
WaitWindowEvent(5)
Wend
EndIf
ProcedureReturn CallWindowProc_(ETCallBack, PBar, Message, wParam, lParam)
EndProcedure
If OpenWindow(0, 0, 0, 270, 40, "ProgressSlider: 60", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
ProgressBarGadget(0, 10, 10, 250, 20, 0, 250, #PB_ProgressBar_Smooth)
SetWindowTheme_(GadgetID(0), 0, @Null)
SendMessage_(GadgetID(0),#CCM_SETBKCOLOR,0,#Black)
SendMessage_(GadgetID(0), #WM_USER + 9, 0, #Red)
SetGadgetState(0, 150)
ETCallback = SetWindowLongPtr_(GadgetID(0), #GWL_WNDPROC, @EventTypeCallbackH())
Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf