
So, da will ich auch mal meinen Beitrag zur Gesellschaft leisten.
Für ein Projekt wollte ich mal fix ein eigenes ProgressBarGadget machen, welches besser
meinen Vorstellungen entspricht.
Nebenbei fällt mir noch auf, dass es CrossPlatform sein sollte (kann's nicht testen).
Vorteile / Warum:
- Text auf dem Gadget
- Text - Handling (Align / Font / Color)
- Farbverlauf im Balken (optional)
- Rahmenfarbe (optional)
- Hintergrundfarbe
Unterschied:
Der Unterschied zu einem PB - ProgressBarGadget liegt darin, dass meines mit Prozenten arbeitet.
Das liegt einfach daran, dass ich so arbeite

Okay, hier nun der Code ... inklusive Beispiel:
Code: Alles auswählen
#PB_Text_Left = 0 ;Gibt's in PB nicht
Structure __my_progressbar_ex_drawing_structure__
bordercolor.i ; -1 -> kein Rand
bgcolor.i
color1.i
color2.i ; -1 -> kein Farbverlauf -> ansonsten Gradiant
EndStructure
Structure __my_progressbar_ex_text_structure__
text.s
color.i
align.i
fontid.i
EndStructure
Structure __my_progressbar_ex_structure__
gadgetid.i
imageid.i
prozentd.d
text.__my_progressbar_ex_text_structure__
drawing.__my_progressbar_ex_drawing_structure__
EndStructure
Global NewList ProgressBarEx.__my_progressbar_ex_structure__()
Procedure _ProgressBarEx_Select(gadid.i)
tmp_return_value.i=#False
ForEach ProgressBarEx()
If ProgressBarEx()\gadgetid=gadid.i
tmp_return_value.i=#True
Break
EndIf
Next
ProcedureReturn tmp_return_value.i
EndProcedure
Procedure ProgressBarEx_Render(gadid.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
Protected boxpart.d, textx.i, texty.i, iw.i, ih.i
;GrößenCheck
If GadgetWidth(gadid.i) <> ImageWidth(ProgressBarEx()\imageid) Or GadgetHeight(gadid.i) <> ImageHeight(ProgressBarEx()\imageid)
ResizeImage(ProgressBarEx()\imageid,GadgetWidth(gadid.i), GadgetHeight(gadid.i))
EndIf
;Rendering
If StartDrawing(ImageOutput(ProgressBarEx()\imageid))
iw.i=ImageWidth(ProgressBarEx()\imageid)
ih.i=ImageHeight(ProgressBarEx()\imageid)
;Hintergrund
Box(0,0,iw,ih,ProgressBarEx()\drawing\bgcolor)
;Balken
boxpart.d = (ProgressBarEx()\prozentd * iw.i) / 100
If ProgressBarEx()\drawing\color2 = -1
Box(0,0,Int(boxpart.d),ih,ProgressBarEx()\drawing\color1)
Else
DrawingMode(#PB_2DDrawing_Gradient)
FrontColor(ProgressBarEx()\drawing\color2)
BackColor(ProgressBarEx()\drawing\color1)
LinearGradient(0,0,0,ih)
Box(0,0,Int(boxpart.d),ih)
EndIf
;Text
If IsFont(ProgressBarEx()\text\fontid)
DrawingFont(FontID(ProgressBarEx()\text\fontid))
EndIf
texty.i= ((ih.i / 2) - (TextHeight(ProgressBarEx()\text\text) / 2))
If ProgressBarEx()\text\align = #PB_Text_Left
textx.i = 3
EndIf
If ProgressBarEx()\text\align = #PB_Text_Center
textx.i = ((iw.i / 2) - (TextWidth(ProgressBarEx()\text\text) / 2))
EndIf
If ProgressBarEx()\text\align = #PB_Text_Right
textx.i = iw.i - 3 - TextWidth(ProgressBarEx()\text\text)
EndIf
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(textx.i, texty.i, ProgressBarEx()\text\text, ProgressBarEx()\text\color)
;Rahmen
If ProgressBarEx()\drawing\bordercolor>-1
DrawingMode(#PB_2DDrawing_Default)
LineXY(0,0,iw-1,0,ProgressBarEx()\drawing\bordercolor)
LineXY(iw-1,0,iw-1,ih,ProgressBarEx()\drawing\bordercolor)
LineXY(iw-1,ih-1,0,ih-1,ProgressBarEx()\drawing\bordercolor)
LineXY(0,ih-1,0,0,ProgressBarEx()\drawing\bordercolor)
EndIf
StopDrawing()
SetGadgetState(ProgressBarEx()\gadgetid, ImageID(ProgressBarEx()\imageid))
EndIf
EndProcedure
Procedure ProgressBarEx_Create(gadid.i, x.i, y.i, w.i, h.i)
AddElement(ProgressBarEx())
ProgressBarEx()\gadgetid=gadid.i
ProgressBarEx()\imageid=CreateImage(#PB_Any, w.i, h.i)
;Defaults setzen
ProgressBarEx()\prozentd = 0.0
ProgressBarEx()\text\align = #PB_Text_Left
ProgressBarEx()\text\color = 0
ProgressBarEx()\drawing\bgcolor = RGB(255,255,255)
ProgressBarEx()\drawing\bordercolor = 0
ProgressBarEx()\drawing\color1 = RGB(0, 255, 0)
ProgressBarEx()\drawing\color2 = RGB(0, 200, 0)
If gadid.i=#PB_Any
ProgressBarEx()\gadgetid=ImageGadget(#PB_Any,x,y,w,h,ImageID(ProgressBarEx()\imageid))
Else
ImageGadget(ProgressBarEx()\gadgetid,x,y,w,h,ImageID(ProgressBarEx()\imageid))
EndIf
ProgressBarEx_Render(ProgressBarEx()\gadgetid)
ProcedureReturn ProgressBarEx()\gadgetid
EndProcedure
Procedure ProgressBarEx_SetState(gadid.i, pbg_state.d = -1.0, pgb_text.s="")
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
If pbg_state.d > -1.0
ProgressBarEx()\prozentd = pbg_state.d
EndIf
If pgb_text.s<>""
ProgressBarEx()\text\text = pgb_text.s
EndIf
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure ProgressBarEx_SetTextAlign(gadid.i, pgb_textalign.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
ProgressBarEx()\text\align = pgb_textalign.i
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure ProgressBarEx_SetTextFont(gadid.i, pgb_font.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
ProgressBarEx()\text\fontid = pgb_font.i
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure ProgressBarEx_SetTextColor(gadid.i, pgb_textcolor.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
ProgressBarEx()\text\color = pgb_textcolor.i
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure ProgressBarEx_SetBGColor(gadid.i, pgb_bgcolor.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
ProgressBarEx()\drawing\bgcolor = pgb_bgcolor.i
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure ProgressBarEx_SetColors(gadid.i, pgb_color1.i, pgb_color2.i = -2)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
ProgressBarEx()\drawing\color1 = pgb_color1.i
If pgb_color2.i>-2
ProgressBarEx()\drawing\color2 = pgb_color2.i
EndIf
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure ProgressBarEx_SetBorderColor(gadid.i, pgb_bcolor.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
;BorderColor = -1 --> Kein Rahmen
ProgressBarEx()\drawing\bordercolor = pgb_bcolor.i
ProgressBarEx_Render(gadid.i)
EndProcedure
Procedure.d ProgressBarExGetState(gadid.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn 0.0:EndIf
ProcedureReturn ProgressBarEx()\prozentd
EndProcedure
Procedure ProgressBarEx_Free(gadid.i)
If _ProgressBarEx_Select(gadid.i)=#False:ProcedureReturn #False:EndIf
If IsImage(ProgressBarEx()\imageid):FreeImage(ProgressBarEx()\imageid):EndIf
If IsGadget(ProgressBarEx()\gadgetid):FreeGadget(ProgressBarEx()\gadgetid):EndIf
DeleteElement(ProgressBarEx())
EndProcedure
;##########################
; TEST
;##########################
test_font.i=LoadFont(#PB_Any,"Verdana",8)
OpenWindow(0,#PB_Ignore,#PB_Ignore,400,80,"ProgressBarEx",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_SizeGadget)
ProgressBarEx_Create(1, 10,10,380,20)
ProgressBarEx_SetState(1, 65.96, "Der Text")
ProgressBarEx_SetBorderColor(1, RGB(150,150,150))
ButtonGadget(2, 10,40,80,20,"Text -> Center")
ButtonGadget(3, 100,40,80,20,"Text -> Font")
ButtonGadget(4, 190,40,80,20,"BG Color")
ButtonGadget(5, 280,40,80,20,"Color")
quit=0
Repeat
event=WaitWindowEvent()
If event
Select event
Case #PB_Event_CloseWindow
If EventWindow()=0:quit=1:EndIf
Case #PB_Event_Gadget
If EventGadget()=2
ProgressBarEx_SetTextAlign(1, #PB_Text_Center)
EndIf
If EventGadget()=3
ProgressBarEx_SetTextFont(1, test_font.i)
EndIf
If EventGadget()=4
ProgressBarEx_SetBGColor(1, RGB(200,200,240))
EndIf
If EventGadget()=5
; ProgressBarEx_SetColors(1, RGB(0,0,255)) ;ändert nur die erste Farbe -> Farbverlauf bleibt
; ProgressBarEx_SetColors(1, RGB(0,0,255), -1) ;ändert die erste Farbe -> Farbverlauf wird deaktiviert
ProgressBarEx_SetColors(1, RGB(100,100,255), RGB(0,0,200))
EndIf
Case #PB_Event_SizeWindow
ResizeGadget(1,#PB_Ignore,#PB_Ignore,WindowWidth(0)-20,#PB_Ignore)
ProgressBarEx_Render(1)
EndSelect
Else
Delay(5)
EndIf
Until quit=1
Debug ProgressBarExGetState(1)
ProgressBarEx_Free(1)
CloseWindow(0)
End
Ich weiß selbst, dass es noch nicht 100% ist. Man sollte noch das Erstellen prüfen und ggf. entsprechende Rückgabewerte setzen.
Aber für mich reicht es erstmal so ... und ansonsten .. feel free ... man kann es ja selbst erweitern

Gruß, Morty