Page 1 sur 1

Eviter de coincer un MessageRequester derrière une fenêtre

Publié : jeu. 08/avr./2010 14:03
par Ar-S
Qu'il est rageant de se retrouver avec un MessageRequester caché derrière votre fenêtre à cause d'un stickyWindow. Fenêtre qui du coup n'est plus déplaçable..
Voilà une petit code pour débutant qui permet d'afficher un MessageRequester() même si la fenêtre est au 1er plan.

Fonctions utilisées : StickyWindow(), SetGadgetState(),GetGadgetState()

Principe :
On doit donc vérifier l'état de StickyWindow(). Si lorsque l'on clique sur le bouton, l'état est 1 alors on repasse cet état à 0.
Une fois le message terminé (que vous avez appuyé sur OK), on remet la fenêtre au 1er plan.

Code : Tout sélectionner

;Voir un MessageRequester même si la fenêtre est au premier plan
; Ar-S / 2010 / PB 4.41

Enumeration
  #W : #BT : #CheckBox_1
EndEnumeration

Global plan=1 ; Valeur du StickyWindow
Global NewPlan ; Valeur de comparaison

If OpenWindow(#W, #PB_Ignore, #PB_Ignore, 542, 302, "Window_0", #PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
  StickyWindow(#W,plan)
  ButtonGadget(#BT, 115, 95, 300, 85, "Clique pour tester")
  CheckBoxGadget(#CheckBox_1, 125, 35, 295, 20, "garder au 1er plan")
  SetGadgetState(#CheckBox_1,plan) ; on active par defaut la fenêtre au 1er plan
EndIf

;{- Event loop
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        
        Case #CheckBox_1
          plan=GetGadgetState(#CheckBox_1)
          SetGadgetState(#CheckBox_1,plan)
          
        Case #BT  
          NewPlan=plan ; On donne à newPlan la même valeur que Plan
          If NewPlan=1 ; si la fenêtre est au 1er plan
            NewPlan=0 ; On lui donne donc la valeur 0 qui permettra de passer la fenêtre au second plan
            SetGadgetState(#CheckBox_1,NewPlan) ; On passe la fenêtre au second plan
          EndIf
          
          ;On fait passer la fenêtre au second plan
          StickyWindow(#W,NewPlan)
          ; on fait apparaitre le messagerequester()
          MessageRequester("Youpi","Le MessageRequester au 1er plan"+Chr(10)+"Et on a l'option de 1er plan décochée")
          
          ; On vérifie que la valeur d'origine soit la même 
          If NewPlan<>plan ; Si ce n'est pas le cas
            SetGadgetState(#CheckBox_1,plan) ; On redonne à la fenêtre l'état d'origine
          EndIf 
      EndSelect

    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #W
          CloseWindow(#W)
          Break
      EndSelect
  EndSelect
ForEver


Re: Eviter de coincer un MessageRequester derrière une fenêt

Publié : sam. 10/avr./2010 15:14
par Backup
ça a l'air bien cool ton code , cependant une question se pose....

pourquoi dans ce cas ne pas faire systematiquement juste ceci a chaque requester

Code : Tout sélectionner

StickyWindow(#W,0); coupe le stkicky de (ou des)  fenetre(s)
MessageRequester() ; affiche le requester
StickyWindow(#W,1); remet le stkicky de(ou des)  fenetre (s)
hein ? pourquoi d'abord ? :lol:

Re: Eviter de coincer un MessageRequester derrière une fenêt

Publié : sam. 10/avr./2010 18:01
par Ar-S
Image

Dans l'exemple c'est plus la relation avec la checkbox et l'état du sticky qui est à observer, Et pis d'abord et si l'utilisateur ne veut pas tout le temps que sa fenêtre soit au 1er plan.. T'es bien embêter ? :mrgreen: hein ? hein ? hein... ? :D

Sinon évidement que pour les messagerequester(),
on pourrait créer un procédure toute bête.

Code : Tout sélectionner

Procedure.s SuperMessRequester(titre$,message$,option,fenetre)
  StickyWindow(fenetre,0)
  MessageRequester(titre$,message$,option)
  StickyWindow(fenetre,1)
EndProcedure
D'ailleurs les MessageRequester() devraient par défaut être toujours au 1er plan, ce serait plus simple :)

Re: Eviter de coincer un MessageRequester derrière une fenêt

Publié : sam. 10/avr./2010 18:08
par Backup
:lol: :lol:

Re: Eviter de coincer un MessageRequester derrière une fenêt

Publié : sam. 10/avr./2010 18:11
par Le Soldat Inconnu
Se méfier tout de même des systèmes de sécurité de windows au niveau du StickyWindow qui font que si tu l'utilises plusieurs fois, il faut que ta fenêtre ait le focus, sinon, ça ne marchera, windows empêchera la mise au premier plan