Seite 1 von 1

Von Rot zu Grün mit steigendem Prozentwert (0=rot, 100=grün)

Verfasst: 20.02.2016 00:33
von Derren
Hier ein kurzer Code, den ich für einen Fortschrittsbalken verwende.
Er erzeugt eine Farbe zwischen Rot und Grün, abhängig von einem Prozentwert. Bei 0% habe ich ein volles rot, bei 100% ein helles grün (wenngleich auch nicht $00FF00)

Code: Alles auswählen

color = ($FF-percentage) + Int(($FF*(percentage/100.0)))<<8

Hier ein Beispielcode:

Code: Alles auswählen

Enumeration 
	#Trackbar
	#Text
	#Canvas
EndEnumeration

OpenWindow(0, 0, 0, 400, 300, "Rot -> Grün", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

TrackBarGadget(#Trackbar, 5, 5, 300, 40, 0, 100)
TextGadget(#Text, 315, 10, 80, 20, "0%")
CanvasGadget(#Canvas, 5, 50, 390, 245)

Define percentage, color

Repeat
	
	Select WaitWindowEvent()
		Case #PB_Event_CloseWindow
			End			
		Case #PB_Event_Gadget
			If EventGadget()=#Trackbar
				
				percentage = GetGadgetState(#Trackbar)				
				SetGadgetText(#Text, Str(percentage) +"%")				
				
				color = ($FF-percentage) + Int(($FF*(percentage/100.0)))<<8
				
				StartDrawing(CanvasOutput(#Canvas))
				Box(0, 0, 390, 245, color)
				DrawText(5, 5, "$" + RSet(Hex(color), 6, "0"))
				StopDrawing()
						
			EndIf 
	EndSelect 	
ForEver 

Re: Von Rot zu Grün mit steigendem Prozentwert (0=rot, 100=g

Verfasst: 20.02.2016 00:38
von RSBasic
:allright:

Re: Von Rot zu Grün mit steigendem Prozentwert (0=rot, 100=g

Verfasst: 20.02.2016 10:09
von Shardik
Danke für die gute Idee! :allright:

Ich habe einmal ein Beispiel erstellt, das direkt die Farbe des Fortschrittbalkens im ProgressBarGadget ändert. Das funktioniert nur, wenn man das Theming für das ProgressBarGadget in Windows abschaltet:

Code: Alles auswählen

EnableExplicit

Define Color.I
Define Count.I

OpenWindow(0, 100, 100, 200, 80, "ProgressBar")
ProgressBarGadget(0, 10, 30, 180, 20, 0, 100, #PB_ProgressBar_Smooth)
SetWindowTheme_(GadgetID(0), " ", " ")
AddWindowTimer(0, 0, 30)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_Timer
      If Count < 100
        Count + 1
        Color = ($FF - Count) + Int(($FF * (Count / 100.0))) << 8
        SetGadgetState(0, Count)
        SetGadgetColor(0, #PB_Gadget_FrontColor, Color)
      EndIf
  EndSelect
ForEver
Das Ganze sollte eigentlich auch auf Linux und MacOS laufen, wenn man die SetWindowTheme_()-Funktion in einen Compilerif..CompilerEndIf-Block setzt:

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
  SetWindowTheme_(GadgetID(0), " ", " ")
CompilerEndIf
Leider funktioniert dies aber unter Linux und MacOS dann trotzdem nicht, weil Apple auf Grund der bekannten (berüchtigten) Human Interface Guidelines so etwas nicht wünscht / verhindert und Linux-Anwender auf Grund der konfigurierbaren Themes dies auch nicht mögen / dürfen. Langer Rede, kurzer Sinn: SetGadgetColor(#ProgressBarGadget, #PB_Gadget_FrontColor, Color) funktioniert auf Linux und MacOS wohl nicht ohne tiefgreifende API-Hacks)... :roll:

Re: Von Rot zu Grün mit steigendem Prozentwert (0=rot, 100=g

Verfasst: 20.02.2016 15:49
von Derren
Deswegen benutz ich ein Canvas-Gadget :D
Benutze das in einem Splashscreen. Der darf ruhig mal mal farblich abweichen :)

Re: Von Rot zu Grün mit steigendem Prozentwert (0=rot, 100=g

Verfasst: 08.05.2016 15:27
von Sicro
Code wird ins CodeArchiv unter Graphics/2D/ControlSmoothColorChangeByPercentage.pb aufgenommen.