Wenn man sich im englischen Forum umsieht, merkt man, dass selbst erstellte Gadgets auf Canvas-Basis "voll in" sind.
Seit ich einen Touchscreen habe, benutze ich einen modifizierten Code von Hroudtwolf (90% Windows Api) als Touch-Kompatibles TrackbarGadget, denn die sind bei normaler Bildschirmauflösung arg schwer zu treffen und verschwinden aus manchen Winkeln ganz, mangels Kontrast.
Jetzt ohne Api mit CanvasGadget.
Das ganze ist nicht wirklich ein TrackbarGadget, eher ein Fortschrittsbalken, dessen Position man mit der Maus bestimmen kann.
Da aber alles selber gezeichnet wird, kann man auch ein einzelnen Zeiger auf einer Schiene darstellen.
Das Border-Flag wird derzeit nicht unterstützt, da sich dadurch die effektive Nutzfläche verringert und ich bis jetzt nur einen Windows-Api-Code zum ermitteln eben jener habe.
==EDIT==
Rev 1:
- Horizontale Fader
- Eigene Images als "Anfasser", "Tracker" oder "Marker" (oder wie auch immer man das nennen will)
Code: Alles auswählen
;-
;- BEGIN INCLUDE
;-
EnableExplicit
;-Flags
#TG_Fader_Horizontal = 1
Structure faderGadget
id.i
state.i
colorF.i
colorB.i
height.i
width.i
min.i
max.i
horizontal.i
image.i
EndStructure
Global NewList FaderGadgets.faderGadget()
Macro RePaint(_INIT_)
Select FaderGadgets()\horizontal
Case 0
MouseY = GetGadgetAttribute(eventGadget, #PB_Canvas_MouseY )
If _INIT_ = #True
MouseY = FaderGadgets()\height
EndIf
StartDrawing(CanvasOutput(eventGadget))
Box(0, 0, FaderGadgets()\width, FaderGadgets()\height, FaderGadgets()\colorB)
If FaderGadgets()\image >= 0
ImagePos = MouseY
If ImagePos <0 : ImagePos = 0 : EndIf
If ImagePos >FaderGadgets()\height : ImagePos = FaderGadgets()\height : EndIf
DrawImage(ImageID(FaderGadgets()\image), 0, ImagePos - ImageHeight(FaderGadgets()\image)/2)
Else
Box(0, MouseY, FaderGadgets()\width, FaderGadgets()\height-MouseY, FaderGadgets()\colorF)
EndIf
State=FaderGadgets()\height-MouseY
If State<0 : State=0:EndIf
If State>FaderGadgets()\height:State=FaderGadgets()\height:EndIf
FaderGadgets()\state = State
StopDrawing()
Case #True
MouseX = GetGadgetAttribute(eventGadget, #PB_Canvas_MouseX )
StartDrawing(CanvasOutput(eventGadget))
Box(0, 0, FaderGadgets()\width, FaderGadgets()\height, FaderGadgets()\colorB)
If FaderGadgets()\image >= 0
ImagePos = MouseX
If ImagePos <0 : ImagePos = 0 : EndIf
If ImagePos >FaderGadgets()\width : ImagePos = FaderGadgets()\width : EndIf
DrawImage(ImageID(FaderGadgets()\image), ImagePos - ImageWidth(FaderGadgets()\image)/2, 0)
Else
Box(0, 0, MouseX, FaderGadgets()\height , FaderGadgets()\colorF)
EndIf
State=FaderGadgets()\width-MouseX
If State<0 : State=0:EndIf
If State>FaderGadgets()\width:State=FaderGadgets()\width:EndIf
StopDrawing()
EndSelect
FaderGadgets()\state = State
EndMacro
Procedure FaderUpdate(eventGadget.i, eventType.i)
Static lDown.i ;leftMouseDown
Protected MouseX.i ;
Protected MouseY.i ;
Protected State.i ;GadgetState
Protected ImagePos.i
ForEach FaderGadgets()
If FaderGadgets()\id = eventGadget
Select eventType
Case #PB_Ignore
Repaint(1)
Case #PB_EventType_LeftButtonDown
lDown = 1
RePaint(0)
Case #PB_EventType_LeftButtonUp
lDown = 0
Case #PB_EventType_MouseLeave
lDown = 0
Case #PB_EventType_MouseMove
If lDown = 1
Repaint(0)
EndIf
EndSelect
EndIf
Next
EndProcedure
Procedure FaderGadget(id.i, x.i, y.i, width.i, height.i, min.i, max.i, FGColor.i, BGColor.i, CanvasFlags.i=0, flags=0, Image.i=-1)
AddElement(FaderGadgets())
With FaderGadgets()
If id = #PB_Any
\id = CanvasGadget(#PB_Any, x, y, width, height, CanvasFlags)
Else
CanvasGadget(id, x, y, width, height, CanvasFlags)
\id = id
EndIf
StartDrawing(CanvasOutput(\id))
Box(0, 0, width, height, BGColor)
StopDrawing()
\colorB = BGColor
\colorF = FGColor
\min = min
\max = max
\height = height
\width = width
If IsImage(image)
\image = image
Else
\image = -1
EndIf
If flags & #TG_Fader_Horizontal
\horizontal = #True
EndIf
FaderUpdate(\id,#PB_Ignore)
ProcedureReturn \id
EndWith
EndProcedure
Procedure GetFaderGadgetState(gadget.i, trueState=#False)
Protected min.i, max.i
Protected state.i
Protected height.i, width.i
Protected scala.i
Protected position.f
ForEach FaderGadgets()
If FaderGadgets()\id = gadget
If truestate = #True
ProcedureReturn FaderGadgets()\state
Else
min = FaderGadgets()\min
max = FaderGadgets()\max
state = FaderGadgets()\state
height = FaderGadgets()\height
width = FaderGadgets()\width
Select FaderGadgets()\horizontal
Case 1
If width>0
position = state / width
EndIf
scala = max-min
ProcedureReturn max - (position * scala )
Default
If height>0
position = state / height
EndIf
scala = max-min
ProcedureReturn position * scala + min
EndSelect
EndIf
EndIf
Next
EndProcedure
DisableExplicit
;-
;- END INCLUDE
;-
;- Beispiel / Example
Define event.i
Define Any_Fader
CreateImage(1, 90, 15)
StartDrawing(ImageOutput(1))
Box(0, 0, 90, 15, $0000FF)
LineXY(0, 0, 90, 8, $00CC00)
LineXY(0, 14, 90, 8, $00CC00)
FillArea(0, 8, $00CC00, $00CC00)
StopDrawing()
CreateImage(2, 15, 90)
StartDrawing(ImageOutput(2))
Box(0, 0, 15, 90, $0000FF)
LineXY(0, 0, 8, 90, 0)
LineXY(14, 0, 8, 90, 0)
FillArea(8, 9, 0, 0)
StopDrawing()
OpenWindow(0, 0, 0, 705, 600, "FaderGadget", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
fadergadget(0, 5, 5, 90, 500, 0, 500, $0000FF, $000000, #PB_Canvas_GrabMouse)
fadergadget(1, 105, 5, 90, 500, 1000, 99999, $0000FF, $000022, #PB_Canvas_GrabMouse, 0, 1)
Any_Fader=fadergadget(#PB_Any, 200, 5, 400, 90, 1, 2, $009900, $330000, #PB_Canvas_GrabMouse)
fadergadget(2, 200, 100, 400, 90, 100, 0, $0066cc, $003300, #PB_Canvas_GrabMouse, #TG_Fader_Horizontal)
fadergadget(3, 200, 195, 400, 90, -10, 10, $0066cc, $003300, #PB_Canvas_GrabMouse, #TG_Fader_Horizontal, 2)
TextGadget(4, 5, 510, 80, 20, "Fader 1:")
TextGadget(5, 105, 510, 80, 20, "Fader 2:")
TextGadget(6, 605, 5, 100, 20, "Fader 3:")
TextGadget(7, 605, 105, 100, 20, "Fader 4:")
TextGadget(8, 605, 195, 100, 20, "Fader 5:")
Repeat
event = WaitWindowEvent(20)
Select event
Case #PB_Event_Gadget
Select EventGadget()
Case 0, 1, 2, 3, Any_Fader
FaderUpdate(EventGadget(), EventType())
SetGadgetText(4, "Fader 1: "+Str(GetFaderGadgetState(0)))
SetGadgetText(5, "Fader 2: "+Str(GetFaderGadgetState(1)))
SetGadgetText(6, "Fader 3: "+Str(GetFaderGadgetState(Any_Fader)))
SetGadgetText(7, "Fader 4: "+Str(GetFaderGadgetState(2)))
SetGadgetText(8, "Fader 5: "+Str(GetFaderGadgetState(3)))
EndSelect
EndSelect
Until event = #PB_Event_CloseWindow