Seite 1 von 1

Runde ProgressBars

Verfasst: 30.01.2005 04:48
von Mischa

Code: Alles auswählen

#maxroundprogresses=10

Structure rprogress
  gadgetid.l
  imageid.l
  imagecolor.l
  backcolor.l
  frontcolor.l
  textcolor.l
  font.l
  max.l
  state.l
  extension.s
EndStructure

Dim RoundProgresses.rprogress(#maxroundprogresses)

Procedure SetRoundProgressState(id,state)
  If state<>RoundProgresses(id)\state
    UseImage(RoundProgresses(id)\imageid)
    w=ImageWidth() : h=ImageHeight()
    dc=StartDrawing(ImageOutput())
    Box(0,0,w,h,RoundProgresses(id)\imagecolor)
    pen=CreatePen_(#PS_SOLID,1,RoundProgresses(id)\backcolor)
    brush=CreateSolidBrush_(RoundProgresses(id)\backcolor)
    SelectObject_(dc,brush) : SelectObject_(dc,pen)
    Ellipse_(dc,0,0,w,h)
    DeleteObject_(brush) : DeleteObject_(pen)
    pen=CreatePen_(#PS_SOLID,1,0)
    If RoundProgresses(id)\frontcolor=-1
      cstate=state * 448 / RoundProgresses(id)\max
      If cstate<256
        color=RGB(255,cstate,0)
      Else
        cstate-256
        color=RGB(255-cstate,255,0)
      EndIf
      brush=CreateSolidBrush_(color)
    Else  
      brush=CreateSolidBrush_(RoundProgresses(id)\frontcolor)
    EndIf
    SelectObject_(dc,brush) : SelectObject_(dc,pen)
    angle.f=state * 360 / RoundProgresses(id)\max
    If angle>0
      If angle>358
        Ellipse_(dc,0,0,w,h)
      Else
        mx=w/2 : my=h/2
        rx.f = 0 - (0 - my) * Sin(6.28318531*angle/360) + mx 
        ry.f = (0 - my) * Cos(6.28318531*angle/360) + my
        x2 = rx : y2 = ry
        Pie_(dc,0,0,w,h,x2,y2,w/2,0) 
      EndIf
    EndIf
    DeleteObject_(brush) : DeleteObject_(pen)
    SelectObject_(dc,RoundProgresses(id)\font)
    SetBkMode_(dc,#TRANSPARENT)
    SetTextColor_(dc,RoundProgresses(id)\textcolor)
    text.s = Str(state)+RoundProgresses(id)\extension
    DrawText_(dc,text,-1,rect.RECT,#DT_CALCRECT)
    diffx=(w-rect\right)/2 : diffy=(h-rect\bottom)/2
    Locate(diffx,diffy)
    DrawText(text)
    StopDrawing()
    RoundProgresses(id)\state = state
  EndIf
  SetGadgetState(RoundProgresses(id)\gadgetid,UseImage(RoundProgresses(id)\imageid))
EndProcedure

Procedure RoundProgress(id,x,y,w,h,ic,bc,fc,tc,font,max,state,ext.s)
  RoundProgresses(id)\gadgetid   = ImageGadget(#PB_Any,x,y,w,h,0)
  RoundProgresses(id)\imageid    = CreateImage(#PB_Any,w,h)
  RoundProgresses(id)\imagecolor = ic
  RoundProgresses(id)\backcolor  = bc
  RoundProgresses(id)\frontcolor = fc
  RoundProgresses(id)\textcolor  = tc
  RoundProgresses(id)\font       = font
  RoundProgresses(id)\max        = max
  RoundProgresses(id)\state      = -1
  RoundProgresses(id)\extension  = ext
  SetRoundProgressState(id,state)
EndProcedure

Procedure RemoveRoundProgress(id)
  FreeImage(RoundProgresses(id)\imageid)
  FreeGadget(RoundProgresses(id)\gadgetid)
EndProcedure  



OpenWindow(0,50,50,450,230,#PB_Window_SystemMenu,"Test")
CreateGadgetList(WindowID())
font1=LoadFont(#PB_Any,"Arial",14,#PB_Font_Bold)
font2=LoadFont(#PB_Any,"Times New Roman",24,#PB_Font_Bold)
font3=LoadFont(#PB_Any,"System",10)

RoundProgress(0,10,10,100,100,GetSysColor_(#COLOR_BTNFACE),RGB(160,160,160),RGB(230,128,230),RGB(255,230,255),UseFont(font1),100,0,"%")
RoundProgress(1,120,10,100,100,GetSysColor_(#COLOR_BTNFACE),RGB(160,160,160),RGB(230,230,128),RGB(255,255,230),UseFont(font1),100,0,"%")
RoundProgress(2,230,10,210,210,GetSysColor_(#COLOR_BTNFACE),RGB(160,160,160),-1,RGB(0,0,0),UseFont(font2),100,0,"%")
RoundProgress(3,10,120,100,100,GetSysColor_(#COLOR_BTNFACE),RGB(160,160,160),RGB(128,230,230),RGB(0,0,0),UseFont(font1),1000,0," Units")
RoundProgress(4,120,120,100,45,GetSysColor_(#COLOR_BTNFACE),RGB(120,120,120),RGB(64,160,160),RGB(0,0,0),UseFont(font3),100,0,"%")
RoundProgress(5,120,175,100,45,GetSysColor_(#COLOR_BTNFACE),RGB(80,80,32),RGB(160,160,64),RGB(255,255,128),UseFont(font3),100,100,"%")

time=timeGetTime_()
Repeat
  Event=WindowEvent()
  If timeGetTime_()-time>80
    state1+1
    If state1>100
      state1=0
    EndIf
    state2+2
    If state2>100
      state2=0
    EndIf
    state3+4
    If state3>100
      state3=0
    EndIf
    state4+5
    If state4>1000
      state4=0
    EndIf
    state5+3
    If state5>100
      state5=0
    EndIf
    state6-2
    If state6<0
      state6=100
    EndIf
    SetRoundProgressState(5,state6)
    SetRoundProgressState(4,state5)
    SetRoundProgressState(3,state4)
    SetRoundProgressState(2,state1)
    SetRoundProgressState(1,state2)
    SetRoundProgressState(0,state3)
    time=timeGetTime_()
  EndIf  
  Delay(5)
Until Event=#PB_Event_CloseWindow
Gruß,
Mischa

Verfasst: 30.01.2005 08:32
von DarkDragon
Guten Morgen,

Funktioniert gut hier, sieht auch ziemlich gut aus ;) .

Verfasst: 30.01.2005 11:31
von bluejoke
coole Sache!

Jetzt kann ich endlich richtig geil C: formatieren und ne Satusanzeige dazu machen :lol:

Re: Runde ProgressBars

Verfasst: 30.01.2005 12:05
von Kiffi
Hallo Mischa,

Klasse! Danke für den Code! :allright:

Grüße ... Kiffi