just a little math and some 2D drawing... that's all .. and the best... it's crossplattform

an image:

and here's the source:
Code: Select all
; ProgressCircle
; 2008 by walker
; free for everyone and any purposes
; enhancements made by others must be published and posted in the same PB-Forum ;-)
;--------------------------------------------
Procedure ProgressCircle(number.l,x.l,y.l,size.l,segments.l,fg.l,bg.l)
img=CreateImage(0,size,size)
StartDrawing(ImageOutput(0))
FillArea(0,0,1,bg)
Circle(size/2,size/2,size/2,fg)
Circle(size/2,size/2,size/2-10,bg)
t2=(segments/4);steps
t3=size/t2; width per step
For n = 0 To t2
LineXY(n*t3,0,size-(n*t3),size,bg)
LineXY(size,n*t3,0,size-(n*t3),bg)
Next
StopDrawing()
ImageGadget(number,x,y,size,size,ImageID(0))
EndProcedure
Procedure SetProgressCircleState(progressbar.l,segments.l, state.l, text.s , color.l, bg.l)
LoadFont(0,"sans",8)
StartDrawing(ImageOutput(0))
If text.s<>""
BackColor(bg)
DrawingFont(FontID(0))
DrawText(ImageWidth(0)/2-(TextWidth(text)/2)-4,(ImageWidth(0)/2-5)," ")
DrawText(ImageWidth(0)/2-(TextWidth(text)/2),(ImageWidth(0)/2-5),text)
EndIf
t2=(segments/4)
t3=ImageWidth(0)/t2
size=ImageWidth(0)
beta.d=(360/segments)*(state)
beta_h.d=(360/segments)/2
beta=beta-beat_h-90
x=ImageWidth(0)/2
y=ImageWidth(0)
cx=ImageWidth(0)/2
cy=ImageWidth(0)/2
r=ImageWidth(0)/2
r-3
beta_in_rad.d=(beta/180)*#PI
x1 = cx+r * Cos(beta_in_rad);
y1 = cy+r * Sin(beta_in_rad);
FillArea(x1,y1,bg,color)
StopDrawing()
SetGadgetState(progressbar,ImageID(0))
While WindowEvent():Wend
ProcedureReturn 1
EndProcedure
;---- DEMO -----<
bg=$D2D8C3; backgroundcolor
fg=$AAB68F; initial color of the circle
stp=12; values 4 , (8,9,10 = 10); 12; 18; 22; 28 for other values the drawing procedure must be changed (and I have no time at present)
size=50;20 is minimum; maximum... your screen ;-)
OpenWindow(0,0,0,210,210,"ProgressCircle DEMO")
CreateGadgetList(WindowID(0))
ProgressCircle(0,70,70,size,stp,fg,bg)
r=10
g=150
b=10
count=0
Repeat
For m= 1 To stp
SetProgressCircleState(0,stp,m,"",RGB(r, g, b),bg)
Delay(100)
Next
count+1
r+20
g+20
b+10
If r >240 Or g>240 Or b>240
r=Random(255)
g=Random(255)
b=Random(255)
EndIf
Until WaitWindowEvent(1)=#PB_Event_CloseWindow Or count=10
End
Enjoy!