Mettre un timeout sur une fenêtre
Publié : ven. 22/janv./2016 14:40
Hello,
À la demande des nombreux (3...
) utilisateurs de mon petit launcher, je suis en train de mettre au point une méthode pour auto escamoter lentement la fenêtre au bout d'un certain temps d'inactivité.
Fonctionnement:
(Version avec Bindevent ou standard fonctionnent pareil)
(PS. J'aime bien le code PUR BASIC de préférence, c'est à dire sans appel direct aux API, sans pointeurs etc. Lisible quoi
)
Techniquement, je remet à zéro le timeout (ici 3 secondes) si la fenêtre a été déplacée, si on a cliqué dessus avec le bouton droit ou gauche ou lâché un objet dessus (j'ai oublié les menus)
Ça fonctionne, mais je je me demande, s'il est possible de simplifier ?
Par exemple une méthode disant: s'il ne se passe rien pendant 3 secondes, alors on déplace la fenêtre.
NB: Je ne peux pas dire "aucun évènement" car il y a toujours plusieurs timers actifs pour gérer l'affichage de l'heure.
Deuxième question: J'aimerais pouvoir arrêter le déplacement en cliquant sur la fenêtre, mais sachant que pour faire un déplacement doux, j'utilise une boucle, cela ne fonctionne pas. Je dois attendre la fin. Je cherche une idée ?
Suggestions, idées bienvenues

À la demande des nombreux (3...

Fonctionnement:
- La fenêtre peut être déplacée n'importe où à tout moment.
- Au bout de 3 secondes d'inactivité, elle glisse lentement hors écran vers la droite
- 1 seconde après elle revient rapidement à la place où elle était dernièrement.
- Chaque fois qu'on fait quelque chose sur la fenêtre le timeout se remet à 5 secondes
Code : Tout sélectionner
; AutoHide 001 - TEST
; Auto hide a window when nothing happens above
; Slowly scrolled off-screen on the right
; (C)Marc56 - 2015-01-22
EnableExplicit
Enumeration
#Window_0
#Check_Second
#Timeout
EndEnumeration
ExamineDesktops()
OpenWindow (#Window_0, DesktopWidth(0) - 130, 0 , 100, 600, "", #PB_Window_SystemMenu | #PB_Window_SizeGadget)
AddWindowTimer (#Window_0, #Check_Second, 1000)
AddWindowTimer (#Window_0, #Timeout, 3000)
Procedure ShowEvent()
Debug FormatDate("%ss", Date())
EndProcedure
Procedure ResetTimer()
Debug "Reset Timeout 5s"
RemoveWindowTimer(#Window_0, #Timeout)
AddWindowTimer(#Window_0, #Timeout, 3000)
EndProcedure
Procedure AutoHide()
Debug "Timeout done: Auto hide window"
Protected i
Protected x = WindowX(#Window_0)
Protected d = DesktopWidth(0) - x
For i = 1 To d + 130
ResizeWindow(#Window_0, x + i, #PB_Ignore, #PB_Ignore , #PB_Ignore)
Delay(10)
Next i
Delay(1000)
ResizeWindow(#Window_0, DesktopWidth(0) + 150, #PB_Ignore, #PB_Ignore , #PB_Ignore)
For i = d + 130 To 1 Step -1
ResizeWindow(#Window_0, x + i, #PB_Ignore, #PB_Ignore , #PB_Ignore)
Delay(5)
Next i
EndProcedure
BindEvent(#PB_Event_Timer, @ShowEvent(), #Window_0, #Check_Second)
BindEvent(#PB_Event_Timer, @AutoHide(), #Window_0, #Timeout)
BindEvent(#PB_Event_ActivateWindow, @ResetTimer(), #Window_0)
BindEvent(#PB_Event_RightClick, @ResetTimer(), #Window_0)
BindEvent(#PB_Event_LeftClick, @ResetTimer(), #Window_0)
BindEvent(#PB_Event_GadgetDrop, @ResetTimer(), #Window_0)
BindEvent(#PB_Event_SizeWindow, @ResetTimer(), #Window_0)
BindEvent(#PB_Event_MoveWindow, @ResetTimer(), #Window_0)
Repeat : Until WaitWindowEvent(50) = #PB_Event_CloseWindow
; -- Version « à l'ancienne »
; Repeat
; Select WaitWindowEvent(10)
;
; Case #PB_Event_Timer
; Select EventTimer()
; Case #Check_Second
; ShowEvent()
; Case #Timeout
; AutoHide()
; EndSelect
;
; Case #PB_Event_ActivateWindow,
; #PB_Event_RightClick,
; #PB_Event_LeftClick,
; #PB_Event_GadgetDrop,
; #PB_Event_SizeWindow,
; #PB_Event_MoveWindow
; ResetTimer()
;
; Case #PB_Event_CloseWindow
; End
;
; EndSelect
; ForEver
End
(PS. J'aime bien le code PUR BASIC de préférence, c'est à dire sans appel direct aux API, sans pointeurs etc. Lisible quoi

Techniquement, je remet à zéro le timeout (ici 3 secondes) si la fenêtre a été déplacée, si on a cliqué dessus avec le bouton droit ou gauche ou lâché un objet dessus (j'ai oublié les menus)
Ça fonctionne, mais je je me demande, s'il est possible de simplifier ?
Par exemple une méthode disant: s'il ne se passe rien pendant 3 secondes, alors on déplace la fenêtre.
NB: Je ne peux pas dire "aucun évènement" car il y a toujours plusieurs timers actifs pour gérer l'affichage de l'heure.
Deuxième question: J'aimerais pouvoir arrêter le déplacement en cliquant sur la fenêtre, mais sachant que pour faire un déplacement doux, j'utilise une boucle, cela ne fonctionne pas. Je dois attendre la fin. Je cherche une idée ?
Suggestions, idées bienvenues
