PureBasic

Forums PureBasic
Nous sommes le Mar 17/Sep/2019 17:33

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 14 messages ] 
Auteur Message
 Sujet du message: Bug ou pas...avant d’embêter fred, j'ai besoins de vous....
MessagePosté: Jeu 02/Mai/2019 5:13 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 18/Jan/2007 14:08
Messages: 234
Bonjour Tous le monde! 8)

J'espère que tout va bien pour vous et je vous remercie de me lire.

Voici un premier code qui marche correctement:
- si je clique sur la fenêtre 0, j'ai des événement sur la fenêtre 0
- si je clique sur la fenêtre 1, j'ai des événement sur la fenêtre 1
Code:
If OpenWindow(0, 0, 0, 300, 600, "fenetre 0", #PB_Window_SystemMenu )
 
  OpenWindow(1, 310, 0, 300, 600, "fenetre 1", #PB_Window_SystemMenu,WindowID(0) )

  Repeat
    event= WaitWindowEvent()
   
    If event<>0 And event<>13110 And event<>275 ;retire quelques évenement commun
      Debug "Evenement PRINC : |"+EventWindow()+" | "+event
    EndIf
 
  Until event= #PB_Event_CloseWindow
EndIf


Les problèmes arrivent lorsque l'on installe un timer :
Code:
If OpenWindow(0, 0, 0, 300, 600, "fenetre 0", #PB_Window_SystemMenu )
 
  OpenWindow(1, 310, 0, 300, 600, "fenetre 1", #PB_Window_SystemMenu,WindowID(0) )
  AddWindowTimer(0,1,100)
  Repeat
    event= WaitWindowEvent()
   
    If event<>0 And event<>13110 And event<>275 ;retire quelques évenement commun
      Debug "Evenement PRINC : |"+EventWindow()+" | "+event
    EndIf
   
  Until event= #PB_Event_CloseWindow
EndIf


On s’aperçoit qu'en cliquant dans la fenetre 1, des événement comme des 512,513,514 sont générés avec comme ID la fenêtre 0 ce qui m'a posé problème et ne me semble pas souhaitable...

Qu'en pensez vous?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 02/Mai/2019 6:43 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2172
Localisation: 50200 Coutances
Bonjour Stefou,

moi, je verrais plutôt àa comme ça :
Code:
If OpenWindow(0, 0, 0, 300, 600, "fenetre 0", #PB_Window_SystemMenu )
 
  OpenWindow(1, 310, 0, 300, 600, "fenetre 1", #PB_Window_SystemMenu,WindowID(0) )
  AddWindowTimer(0,1,100)
  Repeat
    event= WaitWindowEvent()
   
    Select event
      Case #PB_Event_Timer
        Select EventTimer()
          Case 0 ;Timer
           
           
            ;If event<>0 And event<>13110 And event<>275 ;retire quelques évenement commun
            Debug "Evenement PRINC : |"+EventWindow()+" | "+event
            ;EndIf
        EndSelect
    EndSelect
   
  Until event= #PB_Event_CloseWindow
EndIf

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 02/Mai/2019 7:39 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1595
Stefou a écrit:
Les problèmes arrivent lorsque l'on installe un timer :
...
On s’aperçoit qu'en cliquant dans la fenetre 1, des événement comme des 512,513,514 sont générés avec comme ID la fenêtre 0 ce qui m'a posé problème et ne me semble pas souhaitable...
C'est logique: à chaque déclenchement du timer, c'est la fenêtre qui à ce timer qui devient la fenêtre émettrice pour EventWindow(). Peut importe que tu 'check' le timer ou pas dans la boucle, c'est alors la fenêtre 0 qui redevient la fenêtre "en cours".
Les événements 512, 513, 514 (déplacement souris) sont donc toujours retournés comme venant de la fenêtre 0.
Les autres ont bien la fenêtre source.

Si tu veux tester, mets par exemple un timer à 10 secondes et tu verra que EventWindow() changera au bout de 10 secondes

:wink:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 02/Mai/2019 10:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 18/Jan/2007 14:08
Messages: 234
Merci à vous 2

Cela vous parait peut être logique mais pas à moi.

Lorsque je clique sur la fenêtre 1, je devrais avoir l’événement 513 lié à la 1 et non pas à la 0.

Je pensais que l’événement était lié à la fenêtre ou il a eu lieu et pas la fenêtre en cours!

Le timer ne devrait pas changer cela....????


....un autre avis.....


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 02/Mai/2019 12:54 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 02/Oct/2011 16:17
Messages: 2172
Localisation: 50200 Coutances
à moins d'utiliser un canvas par fenêtre et tester les évènements de chaque canvas.

_________________
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce GT 640 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.62, 5.70 LTS
Un homme doit être poli, mais il doit aussi être libre !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 02/Mai/2019 13:29 
Hors ligne

Inscription: Jeu 05/Fév/2009 17:58
Messages: 904
@Stefou
regarde ce code c'est A-Rs qui me l'a passé .Il vient de Lunasol.
En principe ceci devrait te parler.

Code:
EnableExplicit

Define CURSOR.q ; this is POINT structure by fact
Define hWnd

Define MyWindow1 = OpenWindow(#PB_Any, 0, 0, 250, 50, "1")
Define MyWindow2 = OpenWindow(#PB_Any, 250, 0, 250, 50, "2")

Repeat
   If WaitWindowEvent(1) = #PB_Event_CloseWindow
      Break
   EndIf
   
   GetCursorPos_(@CURSOR) ; get cursor pos
   hWnd = WindowFromPoint_(CURSOR) ; get window handle under specified cursor pos (excluding hidden/disabled windows)
   
   If hWnd = WindowID(MyWindow1)
      SetActiveWindow(MyWindow1)
   ElseIf hWnd = WindowID(MyWindow2)
      SetActiveWindow(MyWindow2)
   EndIf
   
  ; Delay(64)
ForEver


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 02/Mai/2019 16:10 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
Tout comme te le dis Marc, le résultat que tu rencontres est normal. Pas de bug.

Dans ton code tu attaches un timer à la fenêtre 0.

EventWindow() ne retourne pas la fenêtre active.
EventWindow() retourne la fenêtre qui a déclenché un événement.

Regarde ton code modifié avec l'utilisation de GetActiveWindow()
Code:
If OpenWindow(0, 0, 0, 300, 600, "fenetre 0", #PB_Window_SystemMenu )
 
  OpenWindow(1, 310, 0, 300, 600, "fenetre 1", #PB_Window_SystemMenu,WindowID(0) )
  AddWindowTimer(0,1,100)
  Repeat
    event= WaitWindowEvent()
   
    If event<>0 And event<>13110 And event<>275 ;retire quelques évenement commun
      Debug "Evenement PRINC : |"+GetActiveWindow()+" | "+event
    EndIf
   
  Until event= #PB_Event_CloseWindow
EndIf
Je pense que c'est le résultat que attends

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Sam 04/Mai/2019 14:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1655
Localisation: Belgique
GetActiveWindow() retourne par-contre la fenêtre qui a le focus

Code:
If OpenWindow(0, 0, 0, 300, 600, "fenetre 0", #PB_Window_SystemMenu )
 
  OpenWindow(1, 310, 0, 300, 600, "fenetre 1", #PB_Window_SystemMenu,WindowID(0) )
  AddWindowTimer(0,1,100)
  Repeat
    event= WaitWindowEvent()
   
    If event<>0 And event<>13110 And event<>275 ;retire quelques évenement commun
      Debug "Evenement PRINC : |"+EventWindow()+" | "+event
      Debug "Active window : "+Str(GetActiveWindow())
    EndIf
   
  Until event= #PB_Event_CloseWindow
EndIf

_________________
Windows 10 64 bits PB: 5.70 ; 5.71 beta 2


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Sam 04/Mai/2019 17:33 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6849
Localisation: IDF (Yvelines)
C'est ce que j'ai repondu dans mon message précédent le tien .....

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Sam 04/Mai/2019 18:02 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3492
falsam a écrit:
C'est ce que j'ai repondu dans mon message précédent le tien .....

C'est ce que j'ai répondu dans mon message précédant le tiens.

C'est quand même plus fassile de voire laid fautes chez les hôtes !

Me cognant stoïquement le chambranle de la porte, récemment baptisée << EXIT >> par le père Mohamed Yomex-Tralucide, je vous salue mes soeurs et frères pour la vélocité de vos réponses, et l'exactitude à laquelle vous ne démordez...


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Dim 05/Mai/2019 20:49 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3492
@Stefou

Avant, j'utilisais les nombres aussi. Jusqu'au jour où ceux-ci ont changé. Résultat : une perte de temps pas prévue.

Je te recommande les constantes natives, à moins que tu utilises des valeurs non pré-réglées. En tout cas, bon courage !


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 09/Mai/2019 4:27 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 18/Jan/2007 14:08
Messages: 234
Bonjour à tous

Je commence par m'excuser de ma réponse tardive que j'excuse tout d'abord par une charge de travail énorme en ce moment, et aussi par le fait que je ne suis pas convaincu par vos réponse.

Je vous remercie pour vos conseils de programmation très aimable, gentils, attentionnés...mais qui nous éloigne du problème car je ne cherche pas de solution.

Si j'avais a programmer un système d'exploitation, tous les événements intervenant sur une fenêtre serait liée à cette fenêtre.

Et c'est dans cet esprit que je programme actuellement.

MAIS je me suis aperçu qu'avec un Timer, quand je clic sur la fenêtre 1 il me renvoie un événement de clic sur la fenêtre 0!

S'il on doit débattre de quelque chose c'est de ça.

Je reprends donc vos argument pour me convaincre que c'est normal:

@Marc56
Citation:
C'est logique: à chaque déclenchement du timer, c'est la fenêtre qui à ce timer qui devient la fenêtre émettrice pour EventWindow(). Peut importe que tu 'check' le timer ou pas dans la boucle, c'est alors la fenêtre 0 qui redevient la fenêtre "en cours".Les événements 512, 513, 514 (déplacement souris) sont donc toujours retournés comme venant de la fenêtre 0.

Je ne comprends pas la logique!
Windows devrait nous dire Timer sur la fenêtre 0 + Clic sur la fenêtre 1

@Falsam
Code:
EventWindow() ne retourne pas la fenêtre active.
EventWindow() retourne la fenêtre qui a déclenché un événement.

On est bien d'accord!!! Alors pourquoi il me dit clic sur la fenêtre 0 puisque je clic sur la 1!!!!

Merci d'avoir pris le temps de me lire et de rester dans le sujet.

Bonne journée à vous tous


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 09/Mai/2019 11:49 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1655
Localisation: Belgique
Ne pas oublier aussi que si tu est sur la fenêtre 0 et que tu clique sur la fenêtre 1 la fenêtre 0 renvoi un événement de type "lost focus".

Le mieux encore est la gestion des événementq avec des "bind" perso cela fait très longtemps que ne gère plus les événements dans la main loop.

Code:
BindEvent(Event,@callback(),window)

_________________
Windows 10 64 bits PB: 5.70 ; 5.71 beta 2


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Bug ou pas...avant d’embêter fred, j'ai besoins de vous.
MessagePosté: Jeu 09/Mai/2019 13:39 
Hors ligne
Avatar de l’utilisateur

Inscription: Mar 31/Mai/2016 9:06
Messages: 2065
Stefou a écrit:
On est bien d'accord!!! Alors pourquoi il me dit clic sur la fenêtre 0 puisque je clic sur la 1!!!!


alors c'est pourtant indiqué dans la doc !!
je cite :
Citation:
Renvoie le numéro de la fenêtre dans laquelle s'est produit le dernier évènement renvoyé

qui te dis, dans ton code que le dernier evenement renvoyé viens de ta fenetre 1 ??

en realité pleins d'event se passent tres tres rapidement ... lorsque tu quitte une fenetre, lorsque tu entres dans une autre etc...
en plus le timer... bref meme windows en ajoutes au passage ....

c'est a toi de choisir l'evenement que tu veux recuperer !

les events windows sont comme une cascade d'eau qui coule , a toi de récupérer les poissons qui te plaisent et qui tombent a la volée ...

ton code revu en plus propre (avec des cases) .. et qui utilise (comme Falsam te l'a expliqué) le bon evenement a recuperer
Code:
enumeration
      #Win_0
      #win_1
      #timer
Endenumeration

If OpenWindow(#win_0, 0, 0, 300, 600, "fenetre 0", #PB_Window_SystemMenu )
      
      OpenWindow(#win_1, 310, 0, 300, 600, "fenetre 1", #PB_Window_SystemMenu,WindowID(#win_0) )
      AddWindowTimer(#win_0,#timer,1000)
      Repeat
            event= WaitWindowEvent(2)
            select Event
                  ;   le Timer
                  case #PB_Event_Timer
                  If EventTimer() =#timer
                        debug "Timer tick"
                  EndIf   
                  case #WM_LBUTTONDOWN
                  debug "la fenetre qui a été cliquée est la numero :"+GetActiveWindow()
            EndSelect
            
      Until event= #PB_Event_CloseWindow
endif




de plus , tu utilises non pas 2 fenetres indépendantes , mais une fenetre qui est la fille de l'autre
c'est deja bien différent que 2 fenetres indépendante !! ;)


si tu veux avoir des events séparés , il te faut gerer ta boucle d'event de cette façon :

Code:

Enumeration 0 ; Id. Fenêtres
   #FENETRE1
   #FENETRE2
EndEnumeration
Enumeration 0 ; Id. Gadgets
   #FEN1_BOUTON
   #FEN1_FERMER
   #FEN2_FERMER
EndEnumeration

If OpenWindow(#FENETRE1, 0, 0, 640, 480, "Fenêtre 1", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)     
   If CreateGadgetList(WindowID(#FENETRE1))
      ButtonGadget(#FEN1_BOUTON, 5,  5, 100, 22, "Ouvrir Fenêtre 2")
      ButtonGadget(#FEN1_FERMER, 5, 45, 100, 22, "Quitter")
   EndIf     
   Repeat           
      Evenement.l = WaitWindowEvent()           
      Select EventWindow()                       
         ;=====================================================
         ;== EVENEMENTS DE LA FENETRE PRINCIPALE
         ;=====================================================
         
         Case #FENETRE1                       
         Select Evenement                                   
            Case #PB_Event_Gadget                                   
            Select EventGadget()                                               
               Case #FEN1_BOUTON
               If OpenWindow(#FENETRE2, 0, 0, 320, 240, "Fenêtre 2", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
                  If CreateGadgetList(WindowID(#FENETRE2))
                     ButtonGadget(#FEN2_FERMER, 5, 5, 100, 22, "Fermer")
                  EndIf
               EndIf                                               
               Case #FEN1_FERMER
               Break                                               
            EndSelect
            
            Case #PB_Event_CloseWindow
            Break
            
         EndSelect
         
         ;=====================================================
         ;== EVENEMENTS DE LA FENETRE SECONDAIRE
         ;=====================================================
         
         Case #FENETRE2                       
         Select Evenement                                   
            Case #PB_Event_Gadget                                   
            If EventGadget() = #FEN2_FERMER
               CloseWindow(#FENETRE2)
            EndIf                                   
            Case #PB_Event_CloseWindow                                   
            CloseWindow(#FENETRE2)                                   
         EndSelect                       
      EndSelect           
   ForEver     
EndIf


; EPB





et le prochain coup , utilise des Constantes, c'est mieux lisible que des 0 ou 1 ou 2 .....

_________________
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 14 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 3 invités


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye