[CanvasGadget] FaderGadget / TrackBarGadget

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

[CanvasGadget] FaderGadget / TrackBarGadget

Beitrag von TomS »

Hi.
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

Zuletzt geändert von TomS am 19.07.2011 19:21, insgesamt 3-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: [CanvasGadget] FaderGadget / TrackBarGadget

Beitrag von RSBasic »

Ich finds toll, wenn Beispielcodes über die Verwendung von CanvasGadget geschrieben werden. Danke für das tolle Beispiel, gute Arbeit. :allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
TomS
Beiträge: 1508
Registriert: 23.12.2005 12:41
Wohnort: München

Re: [CanvasGadget] FaderGadget / TrackBarGadget

Beitrag von TomS »

Danke.
Hab den Code oben angepasst.
Neuerungen siehe Edit ganz oben^^
Antworten