In Verbindung mit einem Timer lässt sich daraus eine Animation
auf einem Canvas realisieren, und das sogar ohne Unterbrechungen
wenn man z.B. das Fenster bewegt. Das was vorher nur mit Threads
oder komplizierten Verrenkungen möglich war...
Der linke Mausknopf im Canvas startet/stoppt die Animation...
Code: Alles auswählen
EnableExplicit
#Window = 0
#Gadget = 0
#Timer = 1
Procedure DrawOnCanvas()
Static Pos.f, Richtung
If StartDrawing(CanvasOutput(#Gadget))
DrawingMode(#PB_2DDrawing_Gradient)
BackColor(#Blue):FrontColor(#Blue)
GradientColor(Pos, RGB(199,199,255))
LinearGradient(0,0,300,0)
Box(0,0,300,60,0)
DrawingMode(#PB_2DDrawing_Default|#PB_2DDrawing_Transparent)
DrawText(10,10,"Simple GadgetAnim",0)
If Richtung = 0
pos + 0.02
Else
pos - 0.02
EndIf
If pos => 1
richtung = 1
ElseIf pos <= 0
richtung = 0
EndIf
StopDrawing()
EndIf
EndProcedure
Procedure ProgramQuit()
End
EndProcedure
Procedure CanvasButton()
Static Go
If Go = 0 ; Jetzt wird gestartet
AddWindowTimer(#Window, #Timer, 10) ; <- Erstellen des Timers (nach wieviel ms neu gezeichnet werden soll)
BindEvent(#PB_Event_Timer, @DrawOnCanvas(), #Window, #Timer) ; <- Hiermit wird der Timer mit der Zeichnungsprozedur verknüpft)
Go = 1
Else ; Und nun wirds gestoppt
UnbindEvent(#PB_Event_Timer, @DrawOnCanvas(), #Window, #Timer) ; <- Das Event wieder lösen
RemoveWindowTimer(#Window, #Timer) ; <- und weg mit dem Timer
Go = 0
EndIf
EndProcedure
Define Event
OpenWindow(#Window, 300, 300, 300, 60, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)
BindEvent(#PB_Event_CloseWindow, @ProgramQuit()) ; Das Fenster schliessen geht an ProgramQuit()
CanvasGadget(#Gadget, 0, 0, 300, 60)
BindGadgetEvent(#Gadget, @CanvasButton(), #PB_EventType_LeftButtonDown) ; Linker Mausknopf an Canvas knebeln.
DrawOnCanvas() ; Einmal Zeichnen damit irgendetwas da ist
Repeat
Event = WaitWindowEvent()
ForEver