Code: Select all
Structure WheelGadgetStructure
window.i
gadget.i
x.i
y.i
width.i
height.i
min.i
max.i
flags.i
Pos.i
LeftButtonDown.i
LastPosMouse.i
EndStructure
Procedure WheelGadgetDraw(*WheelGadget.WheelGadgetStructure)
Protected.i i,PosStep,Pos
If StartDrawing(CanvasOutput(*WheelGadget\gadget))
DrawingMode(#PB_2DDrawing_Gradient):BackColor($808080):FrontColor($FFFFFF)
LinearGradient(0,0,*WheelGadget\width/2,0):Box(0,0,*WheelGadget\width/2,*WheelGadget\height)
LinearGradient(*WheelGadget\width,0,*WheelGadget\width/2,0):Box(*WheelGadget\width/2,0,*WheelGadget\width/2,*WheelGadget\height)
DrawingMode(#PB_2DDrawing_Default)
Box(*WheelGadget\Pos-1,0,3,*WheelGadget\height,#Red)
PosStep=*WheelGadget\width/9
Pos=*WheelGadget\Pos-PosStep
While Pos>0
LineXY(Pos,0,Pos,*WheelGadget\height,#Gray)
Pos-PosStep
Wend
Pos=*WheelGadget\Pos+PosStep
While Pos<*WheelGadget\width
LineXY(Pos,0,Pos,*WheelGadget\height,#Gray)
Pos+PosStep
Wend
DrawingMode(#PB_2DDrawing_Outlined)
If *WheelGadget\Flags!#PB_ScrollArea_BorderLess
Box(0,0,*WheelGadget\width,*WheelGadget\height,0)
EndIf
StopDrawing()
EndIf
EndProcedure
Procedure WheelGadgetDrawVertical(*WheelGadget.WheelGadgetStructure)
Protected.i i,PosStep,Pos
If StartDrawing(CanvasOutput(*WheelGadget\gadget))
DrawingMode(#PB_2DDrawing_Gradient):BackColor($808080):FrontColor($FFFFFF)
LinearGradient(0,0,0,*WheelGadget\height/2):Box(0,0,*WheelGadget\width,*WheelGadget\height/2)
LinearGradient(0,*WheelGadget\height,0,*WheelGadget\height/2):Box(0,*WheelGadget\height/2,*WheelGadget\width,*WheelGadget\height/2)
DrawingMode(#PB_2DDrawing_Default)
Box(0,*WheelGadget\Pos-1,*WheelGadget\width,3,#Red)
PosStep=*WheelGadget\height/9
Pos=*WheelGadget\Pos-PosStep
While Pos>0
LineXY(0,Pos,*WheelGadget\width,Pos,#Gray)
Pos-PosStep
Wend
Pos=*WheelGadget\Pos+PosStep
While Pos<*WheelGadget\height
LineXY(0,Pos,*WheelGadget\width,Pos,#Gray)
Pos+PosStep
Wend
DrawingMode(#PB_2DDrawing_Outlined)
If *WheelGadget\Flags!#PB_ScrollArea_BorderLess
Box(0,0,*WheelGadget\width,*WheelGadget\height,0)
EndIf
StopDrawing()
EndIf
EndProcedure
Procedure WheelGadgetCB()
Protected PosMouse.i,*WheelGadget.WheelGadgetStructure
*WheelGadget=GetGadgetData(EventGadget())
If *WheelGadget
Select EventType()
Case #PB_EventType_LeftButtonDown
*WheelGadget\LeftButtonDown=1
*WheelGadget\LastPosMouse=GetGadgetAttribute(*WheelGadget\gadget,#PB_Canvas_MouseX)
Case #PB_EventType_LeftButtonUp
*WheelGadget\LastPosMouse=0
*WheelGadget\LeftButtonDown=0
PosMouse=0
*WheelGadget\Pos=*WheelGadget\width/2
PostEvent(#PB_Event_Gadget, *WheelGadget\window, *WheelGadget\gadget, #PB_EventType_Change,0)
WheelGadgetDraw(*WheelGadget)
Case #PB_EventType_MouseMove
If *WheelGadget\LeftButtonDown And *WheelGadget\LastPosMouse>0 And *WheelGadget\LastPosMouse<*WheelGadget\width
PosMouse=GetGadgetAttribute(*WheelGadget\gadget,#PB_Canvas_MouseX)
*WheelGadget\Pos-*WheelGadget\LastPosMouse+PosMouse
*WheelGadget\LastPosMouse=PosMouse
If *WheelGadget\Pos<1:*WheelGadget\Pos=1:EndIf
If *WheelGadget\Pos>*WheelGadget\width:*WheelGadget\Pos=*WheelGadget\width:EndIf
PostEvent(#PB_Event_Gadget,*WheelGadget\window,*WheelGadget\gadget, #PB_EventType_Change,-100+(*WheelGadget\Pos-1)*(100+100)/(*WheelGadget\width-1))
WheelGadgetDraw(*WheelGadget)
EndIf
EndSelect
EndIf
EndProcedure
Procedure WheelGadgetCBVertical()
Protected PosMouse.i,*WheelGadget.WheelGadgetStructure
*WheelGadget=GetGadgetData(EventGadget())
If *WheelGadget
Select EventType()
Case #PB_EventType_LeftButtonDown
*WheelGadget\LeftButtonDown=1
*WheelGadget\LastPosMouse=GetGadgetAttribute(*WheelGadget\gadget,#PB_Canvas_MouseY)
Case #PB_EventType_LeftButtonUp
*WheelGadget\LastPosMouse=0
*WheelGadget\LeftButtonDown=0
PosMouse=0
*WheelGadget\Pos=*WheelGadget\height/2
PostEvent(#PB_Event_Gadget, *WheelGadget\window,*WheelGadget\gadget,#PB_EventType_Change,0)
WheelGadgetDrawVertical(*WheelGadget)
Case #PB_EventType_MouseMove
If *WheelGadget\LeftButtonDown And *WheelGadget\LastPosMouse>0 And *WheelGadget\LastPosMouse<*WheelGadget\height
PosMouse=GetGadgetAttribute(*WheelGadget\gadget,#PB_Canvas_MouseY)
*WheelGadget\Pos-*WheelGadget\LastPosMouse+PosMouse
*WheelGadget\LastPosMouse=PosMouse
If *WheelGadget\Pos<1:*WheelGadget\Pos=1:EndIf
If *WheelGadget\Pos>*WheelGadget\height:*WheelGadget\Pos=*WheelGadget\height:EndIf
PostEvent(#PB_Event_Gadget,*WheelGadget\window,*WheelGadget\gadget, #PB_EventType_Change,-100+(*WheelGadget\Pos-1)*(100+100)/(*WheelGadget\height-1))
WheelGadgetDrawVertical(*WheelGadget)
EndIf
EndSelect
EndIf
EndProcedure
Procedure.i WheelGadget(gadget.i, x.i, y.i, width.i, height.i, min.i=-1, max.i=-1, Flags.i=0)
Protected gadgetno.i,result.i,*WheelGadget.WheelGadgetStructure
If gadget=#PB_Any
gadgetno=CanvasGadget(gadget,x,y,width,height)
result=gadgetno
Else
gadgetno=gadget
result=CanvasGadget(gadget,x,y,width,height)
EndIf
If result
*WheelGadget=AllocateStructure(WheelGadgetStructure)
*WheelGadget\window=GetActiveWindow()
*WheelGadget\gadget=gadgetno
*WheelGadget\x=x
*WheelGadget\y=y
*WheelGadget\width=width
*WheelGadget\height=height
If min<>-1 And max>min
*WheelGadget\min=min
*WheelGadget\max=max
Else
*WheelGadget\min=0
*WheelGadget\max=100
EndIf
*WheelGadget\flags=flags
If *WheelGadget\flags&#PB_ScrollBar_Vertical
*WheelGadget\Pos=height/2
WheelGadgetDrawVertical(*WheelGadget)
BindGadgetEvent(gadgetno, @WheelGadgetCBVertical(), #PB_All)
Else
*WheelGadget\Pos=width/2
WheelGadgetDraw(*WheelGadget)
BindGadgetEvent(gadgetno, @WheelGadgetCB(), #PB_All)
EndIf
SetGadgetData(gadgetno,*WheelGadget)
EndIf
ProcedureReturn result
EndProcedure
OpenWindow(0,0,0,400,400,"WheelGadget example",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
WheelGadget(0,10,10,380,30,-1,-1,#PB_ScrollArea_BorderLess):TextGadget(5,190,40,30,20,"0%")
WheelGadget(1,100,60,20,300,100,900,#PB_ScrollBar_Vertical):TextGadget(6,70,200,30,20,"0%")
Repeat
Event.i=WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 0
If EventType()=#PB_EventType_Change
SetGadgetText(5,Str(EventData())+"%")
EndIf
Case 1
If EventType()=#PB_EventType_Change
SetGadgetText(6,Str(EventData())+"%")
EndIf
EndSelect
EndSelect
Until Event=#PB_Event_CloseWindow