Page 1 sur 1

ResizeGadgetex et ResizeWindowEx (PB/SB)

Publié : jeu. 28/sept./2017 14:50
par Guillot
salut,

2 petites fonctions pour redimensionner fenetres et gadgets avec une durée de transition

note:
la gestion du timer n'est pas tres adaptée à ce type d'utilisation
ça serait bien d'avoir une fonction:

AddTimer(#Timer , Timeout, @Callback() )
avec possibilité de de mettre #PB_all, pour s'assurer d'avoir un numero de timer dispo
(et FreeTimer(#Timer) )

Code : Tout sélectionner

EnableExplicit

;#############################################################################################################################
;                                              ResizeGadgetEx, ResizeWindowEx
;#############################################################################################################################

Structure sgpos
    x.l
    y.l
    w.l
    h.l
EndStructure

Structure sgresize
    w.b
    n.i
    p0.sgpos
    p1.sgpos
    ei.i
    duration.i
EndStructure

Global NewMap grz.sgresize()

Procedure event_timer_resize()
    Static ei,c:c+1
    Protected d,r.f
    ForEach grz()
        With grz()
            d=ElapsedMilliseconds()-\ei
            r=d/\duration:If r>=1:r=1:EndIf
            r=Sin(r*#PI/2)
            If \w
                ResizeWindow(\n,\p0\x+(\p1\x-\p0\x)*r,\p0\y+(\p1\y-\p0\y)*r,  \p0\w+(\p1\w-\p0\w)*r,\p0\h+(\p1\h-\p0\h)*r)
            Else
                ResizeGadget(\n,\p0\x+(\p1\x-\p0\x)*r,\p0\y+(\p1\y-\p0\y)*r,  \p0\w+(\p1\w-\p0\w)*r,\p0\h+(\p1\h-\p0\h)*r)
            EndIf
            If d>=\duration:DeleteMapElement(grz()):EndIf
        EndWith
    Next
EndProcedure

Procedure ResizeGadgetEx(gadget,x,y,width,height,duration)
    With grz(Str(gadget))
        \n=gadget
        \p0\x=GadgetX(gadget):\p1\x=x
        \p0\y=GadgetY(gadget):\p1\y=y
        \p0\w=GadgetWidth(gadget):\p1\w=width
        \p0\h=GadgetHeight(gadget):\p1\h=height
        \ei=ElapsedMilliseconds()
        \duration=duration
    EndWith
EndProcedure

Procedure ResizeWindowEx(window,x,y,width,height,duration)
    With grz(Str(window))
        \n=window
        \p0\x=WindowX(window):\p1\x=x
        \p0\y=WindowY(window):\p1\y=y
        \p0\w=WindowWidth(window):\p1\w=width
        \p0\h=WindowHeight(window):\p1\h=height
        \ei=ElapsedMilliseconds()
        \duration=duration
        \w=1
    EndWith
EndProcedure

;#############################################################################################################################
;                                                           DEMO
;#############################################################################################################################

Procedure gresize()
    ResizeGadgetex(EventGadget(),Random(300),Random(300),Random(400,50),Random(200,20),Random(2000,200))
EndProcedure

Procedure wresize()
    ResizeWindowEx(EventWindow(),Random(600),Random(600),Random(600,300),Random(600,300),Random(2000,200))
EndProcedure

Define i,j,ng
For j=0 To 3
OpenWindow(j,0,0,200,200,"click on the window"):BindEvent(#PB_Event_LeftClick,@ wresize(),j)
For i=0 To 3:ng=j*10+i:ButtonGadget(ng,100,10+i*100,400,50,"click me"):BindGadgetEvent(ng,@ gresize()):Next
ResizeWindowEx(j,j*200,j*100,600,600,1000)
Next

AddWindowTimer(0,0,20)
BindEvent(#PB_Event_Timer,@ event_timer_resize())

CompilerIf #PB_Compiler_OS <> #PB_OS_Web:Repeat:Until WaitWindowEvent()=#PB_Event_CloseWindow:CompilerEndIf

Re: ResizeGadgetex et ResizeWindowEx (PB/SB)

Publié : jeu. 28/sept./2017 15:45
par falsam
Joli effet. Merci pour ce partage.

Re: ResizeGadgetex et ResizeWindowEx (PB/SB)

Publié : jeu. 28/sept./2017 20:23
par Kwai chang caine
Oui c'est rigolo :D
Un tres léger flickering au resizing des gadgets chez moi (peut être ce que tu voulais dire pour le timer), mais c'est cool
Merci du partage 8)

Re: ResizeGadgetex et ResizeWindowEx (PB/SB)

Publié : ven. 29/sept./2017 9:16
par Guillot
ouai, c'est un peu crado sur PB
mais sur SB c'est propre, ça permettra de faire des petites anim sans se casser le derche
le problème de la gestion des timer, c'est de devoir les rattacher à une fenetre et de pas avoir accès à un numéro libre (comme les autre objet avec #PB_all)