Fenetre Escamotable

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Fenetre Escamotable

Message 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.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Fenetre Escamotable

Message 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.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Fenetre Escamotable

Message 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)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: Fenetre Escamotable

Message 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.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Fenetre Escamotable

Message 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
:)
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fenetre Escamotable

Message 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




~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: Fenetre Escamotable

Message 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:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fenetre Escamotable

Message par Ar-S »

Effectivement, j'ai modifié mon code, j'ai du coup viré le 2 if/endif.
nikel
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fenetre Escamotable

Message par Ar-S »

je l'ai ajouté à mon code ( UpdateWindow_(GadgetID(#bouton)) ) ça mrche au poil Spock
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre