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

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

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

Message 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

~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

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

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

Message 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 :)
~~~~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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

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

Message par Backup »

:lol: :lol:
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

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

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre