Steuerelement Animation

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Steuerelement Animation

Beitrag von Lambda »

Ich schreib zurzeit für ein größeres Projekt neue Steuerelemente, welche möglichst "integriert", flüssig, schell, flexibel und funktional sein sollen. (HyperTree, DockBar, SwiftPanel, Ribbon, GradientBar)

Damit das ganze noch eleganter wirkt möchte ich Fading und weiche Bewegungs Animationen ermöglichen (optional). Meine Frage ist jetzt welcher Weg am optimalsten wäre.

1. Thread
Ein Thread für jede Klasse. Also 8 Gadgets des selben Typs werden durch ein Thread mit geringer Priorität gesteuert, der zudem pausiert wird solange keine Animation mehr stattfindet.


2. Callback
Ein Callback dem Fenster anhängen, wobei ich nicht weiß ob es zum Stop kommt wenn WaitWindowEvent verwendet wird.


Schnelleres Rendern auf Canvas?
Eine andere Frage wäre noch, ob noch schnelleres Rendern möglich ist. Canvas ist ja schon sehr gut, nur auf größeren Flächen etwas langsam meiner Meinung. Wäre es schneller mit BitBlt_() ein fertig gerenderten Frame direkt in den Buffer zu pushen? (damit kein weißes Flackern entstehen kann)

GDI+ schneller?
Ich würde eigentlich gerne GDI+ verwenden da es mehr Möglichkeiten und Anti-Aliasing bietet. Aber nachdem ich mich über die Performance informiert hab soll es sehr langsam sein? (mit HighSpeed)

Wäre sehr dankbar für Tipps und Vorschläge. Werde diese neuen Gadgets auch hier mit euch teilen wer sie verwenden kann, wie bereits DockBar und GradientGadget. Gerade bei DockBar möchte ich eine Flüssige Klapp-Bewegung der Elemente.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Steuerelement Animation

Beitrag von Danilo »

Du kannst einen Timer für die Gadgets nehmen und ihnen Befehle zuordnen, die im Timer
abgearbeitet werden. Kleines Beispiel zum auf- und zuklappen (Befehle OpenCanvas und CloseCanvas):

Code: Alles auswählen

Enumeration
    #OpenCanvas = 1
    #CloseCanvas
EndEnumeration

Procedure RepaintCanvas(canvas)
    If StartDrawing(CanvasOutput(canvas))
        width  = GadgetWidth(canvas)
        height = GadgetHeight(canvas)
        Box(0,0,width,height,RGB($FF,$FF,$FF))
        DrawingMode(#PB_2DDrawing_Outlined)
        Box(0,0,width,height,RGB($00,$00,$00))
        DrawingMode(#PB_2DDrawing_Transparent)
        For y = 0 To height-20 Step 20
            DrawText(10,y,Str(i),0)
            i+1
        Next
        StopDrawing()
    EndIf
EndProcedure

Procedure Timer(hWnd,msg,idEvent,dwTime)
    state  = GetGadgetData(0)
    height = GadgetHeight(0)
    If state = #OpenCanvas
        If height < 400
           ResizeGadget(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,height+20)
           RepaintCanvas(0)
        Else
           SetGadgetData(0,0)
        EndIf
    ElseIf state = #CloseCanvas
        If height > 20
           ResizeGadget(0,#PB_Ignore,#PB_Ignore,#PB_Ignore,height-20)
           RepaintCanvas(0)
        Else
           SetGadgetData(0,0)
        EndIf
    Else
        KillTimer_(hWnd,idEvent)
    EndIf
EndProcedure

Procedure OpenCanvas(canvas)
    SetGadgetData(canvas,#OpenCanvas)
    SetTimer_(GadgetID(canvas),1,10,@Timer())
EndProcedure

Procedure CloseCanvas(canvas)
    SetGadgetData(canvas,#CloseCanvas)
    SetTimer_(GadgetID(canvas),1,10,@Timer())
EndProcedure

If OpenWindow(0, 0, 0, 800, 600, "CanvasGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 120, 10, 670, 20)
    ButtonGadget(1,  10, 10, 100, 20, "Open")

    RepaintCanvas(0)

    Repeat
      Event = WaitWindowEvent()
          
      If Event = #PB_Event_Gadget And EventGadget() = 1
        If GetGadgetText(1)="Open"
            SetGadgetText(1,"Close")
            OpenCanvas(0)
        Else
            SetGadgetText(1,"Open")
            CloseCanvas(0)
        EndIf
      EndIf    
      
    Until Event = #PB_Event_CloseWindow
EndIf
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten