Page 1 sur 1

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 11:50
par nico
Tu as remarqué le problème d'affichage à l'ouverture comme je te l'avais signalé et lorsqu'on a un double écran, la fenêtre est toujours apparente.

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 12:12
par nico
Le problème à l'ouverture est que les gadgets ne sont pas dessinés pendant la transition, ils s'affichent une fois la transition terminée.

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 13:38
par Marc56
nico a écrit :Le problème à l'ouverture est que les gadgets ne sont pas dessinés pendant la transition, ils s'affichent une fois la transition terminée.
Dixit Fred sur le forum us il y a quelque temps, sur ce sujet: Les gagdets ne sont redessinés que lors d'une boucle d'attente (WindowEvent()). Une seule itération suffit.

Ligne 78, après (ResizeWindow) tu ajoutes

Code : Tout sélectionner

While WindowEvent(): Wend
:)

Dans le code de Dobro:

Code : Tout sélectionner

Procedure Move_window(fenetre,direction,vitesse)
   ;by Dobro
   ExamineDesktops()
   largeur_bureau=DesktopWidth(0)
   larg_fenetre=WindowWidth(fenetre)
   Select direction
      Case 1 ; vers la gauche
      For i=largeur_bureau To (largeur_bureau-larg_fenetre ) Step-1
          ResizeWindow(Fenetre, i, #PB_Ignore,#PB_Ignore, #PB_Ignore)
          While WindowEvent() : Wend    ; <<< *** Boucle à vide pour forcer le rafraichissement des gadgets ***
         Delay(vitesse)
      Next i
      Case -1 ; vers la droite
      For i=(largeur_bureau-larg_fenetre)  To Largeur_bureau 
          ResizeWindow(Fenetre, i, #PB_Ignore,#PB_Ignore, #PB_Ignore)
         Delay(vitesse)
      Next i
   EndSelect
EndProcedure
Magique: les gadgets sont affichés en même temps que le déplacement.
Cependant je n'ai pas testé sur mon appli (qui contient 124 gadgets sur la fenêtre principale)

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 15:14
par nico
Bien joué, je note des variations sur la vitesse de déplacement parfois cela semble se bloquer un chouilla, peut être dû au debug.

En tout cas, marche bien.

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 15:45
par Marc56
On peut compenser la lenteur de régénération avec plusieurs solutions:
  • N'afficher les gadgets qu'une fois sur 5 par exemple.
  • Ne pas faire une vitesse constante (démarrer doucement puis accélérer)
  • N'afficher qu'un cadre (si on est sur une machine lente (tester CPU avant))
  • Faire une copie écran de la fenêtre (je ne sais pas le faire) et déplacer cette image au lieu de la fenêtre.
Illusion
:)

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 16:27
par Ar-S
J'ai voulu tâter du bindevent, je me retrouve coincer avec l'histoire de gadget qui apparait une fois la fenêtre stoppée. Le While WindowEvent(): Wend n'etant pas supporté par bindevent.
Dommage ;)

Cependant ça fonctionne

Code : Tout sélectionner

InitMouse()
ExamineDesktops()

Enumeration
   #win
EndEnumeration
Enumeration
   #bouton
   #TACTION
   #TMOUSE
EndEnumeration

; ETAT
#FEN_CACHE = 0
#FEN_OUVERTE = 1
; ACTION
#AFFICHE = 1
#CACHE = 2
#STOP = 3

Global.b ETAT, ACTION
Global L_DESK=DesktopWidth(0), H_DESK=DesktopHeight(0), X_WIN, Y_WIN, X_WIN_MAX
Global L_WIN = 220, H_WIN = 400
Global.i Mx, My

Declare  Action()
Declare Fermer()
Declare CheckMouse()


ETAT = #FEN_OUVERTE
X_WIN = (L_DESK - L_WIN)
X_WIN_MAX = (L_DESK - 2)
Y_WIN = 100

If OpenWindow(#win, X_WIN, Y_WIN, L_WIN, H_WIN, "Exemple...", #PB_Window_SystemMenu)
   ButtonGadget  (#bouton, 10, 60, 200, 30, "Fermer")
   
   AddWindowTimer(#win, #TMOUSE, 30)
   AddWindowTimer(#win, #TACTION, 100)
   
BindEvent(#PB_Event_Timer,@CheckMouse(), #win, #TMOUSE )
BindEvent(#PB_Event_Timer,@Action(),     #win, #TACTION )
   BindEvent(#PB_Event_CloseWindow,@Fermer())
   BindGadgetEvent(#bouton,@Fermer() )
   
   Repeat
      Event = WindowEvent()
   Until quite = 1
   End
   
EndIf

Procedure Fermer()
   quite = 1
   End
EndProcedure


Procedure CheckMouse()

      Mx = DesktopMouseX()
      My = DesktopMouseY()
      Debug mx
      
      If MX > L_DESK -5 And ETAT = #FEN_CACHE
         Debug "Réapparition ON"
         ACTION = #AFFICHE
      ElseIf MX < X_WIN And ETAT = #FEN_OUVERTE 
         Debug "Disparition ON"
         ACTION = #CACHE
      ElseIf MX > X_WIN And ETAT = #FEN_OUVERTE 
         Debug "RIEN"
         ACTION = #STOP
      
      Else
         Debug " rien "
         ACTION = #STOP
      EndIf
      
EndProcedure

Procedure Action()

      Select ACTION
         Case #AFFICHE
            COmpte = X_WIN_MAX
           
               Debug "OUVERTURE"
               Repeat
                  ResizeWindow(#win, Compte, #PB_Ignore,#PB_Ignore, #PB_Ignore)
                  UpdateWindow_(GadgetID(#bouton))
                  Compte-1
               Until Compte = X_WIN
               ETAT = #FEN_OUVERTE
               ACTION = #STOP

         Case #CACHE
            COmpte = X_WIN
              Repeat
                  ResizeWindow(#win, Compte, #PB_Ignore,#PB_Ignore, #PB_Ignore)
                  Compte+1
               Until Compte = X_WIN_MAX
               ETAT = #FEN_CACHE
               ACTION = #STOP

      EndSelect
   
EndProcedure





Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 16:43
par Marc56
Tu devrais pouvoir supprimer quelques lignes en affinant le BindEvent (pas testé, mais ça devrait fonctionner)

Remplace:

Code : Tout sélectionner

BindEvent(#PB_Event_Timer,@CheckMouse() )
BindEvent(#PB_Event_Timer,@Action() )
Par:

Code : Tout sélectionner

BindEvent(#PB_Event_Timer,@CheckMouse(), #win, #TMOUSE )
BindEvent(#PB_Event_Timer,@Action(),     #win, #TACTION )
Ce qui te permet de supprimer "If EventTimer() = #..." dans les deux procédures.

Ça te fait gagner 2 tests (entrer dans la procédure à chaque fois + Tester EventTimer() )

(C'est l'un des avantages de BindEvent: aller directement à l'objet/évènement)
:wink:

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 18:51
par Ar-S
Effectivement, j'ai modifié mon code, j'ai du coup viré le 2 if/endif.
nikel

Re: Fenetre Escamotable

Publié : mar. 26/janv./2016 20:01
par Ar-S
je l'ai ajouté à mon code ( UpdateWindow_(GadgetID(#bouton)) ) ça mrche au poil Spock