Page 1 sur 1

Problème avec la gestion des fenêtres multiples sous Windows

Publié : mar. 01/juil./2025 20:15
par Hektor
Salut à tous,
Je bosse sur une appli qui doit gérer plusieurs fenetres indépendantes mais je galère avec le focus et la gestion des événements quand j’ouvre plusieurs fenetre. En gros, des que j’ai deux fenetres ouvertes les messages clavier et souris n’arrivent plus toujours à la bonne fenêtre. J’utilise OpenWindow pour créer les fenetres et un loop classique Repeat...Until Event = #PB_Event_CloseWindow. J’ai essayé de vérifier les EventWindow() en suivant des conseils sur libre-octet pour router les events mais ca bug souvent surtout avec les raccourcis clavier. Une idée pour tracker correctement la fenetre active sans partir sur un truc trop lourd serait d’une grande aide.
Merci d’avance !

Re: Problème avec la gestion des fenêtres multiples sous Windows

Publié : mar. 01/juil./2025 22:24
par Ar-S
Salut,
Poste un code sommaire de ton soucis.

Re: Problème avec la gestion des fenêtres multiples sous Windows

Publié : mer. 02/juil./2025 15:45
par Jacobus
Bonjour,
voici un petit exemple tout simple de gestion de plusieurs fenêtres. Il y a d'autres méthodes, mais celle-ci est facile à comprendre. L'avantage est que tu n'as qu'une seule boucle d'évènements à gérer. Tu peux ensuite ajouter les actions/évènements que tu veux. :)

Code : Tout sélectionner

;-Constantes
Enumeration Fenetres
  #WINMAIN
  #WIN_1
  #WIN_2
EndEnumeration
Enumeration Gadgets
  ;-Gadgets #WINMAIN
  #BTN_WIN1
  #BTN_WIN2
  #BTN_1
  #BTN_2
  #BTN_Close_WINMAIN
  #EDITOR_WINMAIN
  ;-Gadgets #WIN_1
  #BTN_3
  #BTN_4
  #BTN_Close_WIN_1
  #EDITOR_WIN_1
  ;-Gadgets #WIN_2
  #BTN_5
  #BTN_6
  #BTN_Close_WIN_2
  #EDITOR_WIN_2
EndEnumeration

Procedure Window_N1() 
  If OpenWindow(#WIN_1, 0, 0, 500, 300, "Fenêtre #WIN_1", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar) <> 0    
    ButtonGadget(#BTN_3, 10, 20, 100,30, "Transférer")        : GadgetToolTip(#BTN_3,           "Transférer texte dans éditeur principal")
    ButtonGadget(#BTN_4, 10, 60, 100,30, "Effacer tout")      : GadgetToolTip(#BTN_4,           "Effacer le contenu de l'éditeur")
    ButtonGadget(#BTN_Close_WIN_1, 10, 100, 100,30, "Fermer") : GadgetToolTip(#BTN_Close_WIN_1, "Fermer cette fenêtre")
    EditorGadget(#EDITOR_WIN_1, 120, 20, 360, 260, #PB_Editor_WordWrap)
  EndIf 
EndProcedure
Procedure Window_N2()
  If OpenWindow(#WIN_2, 0, 0, 500, 300, "Fenêtre #WIN_2", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar) <> 0    
    ButtonGadget(#BTN_5, 10, 20, 100,30, "Transférer")        : GadgetToolTip(#BTN_5,           "Transférer texte dans éditeur principal")
    ButtonGadget(#BTN_6, 10, 60, 100,30, "Effacer tout")      : GadgetToolTip(#BTN_6,           "Effacer le contenu de l'éditeur")
    ButtonGadget(#BTN_Close_WIN_2, 10, 100, 100,30, "Fermer") : GadgetToolTip(#BTN_Close_WIN_2, "Fermer cette fenêtre")
    EditorGadget(#EDITOR_WIN_2, 120, 20, 360, 260, #PB_Editor_WordWrap)
  EndIf
EndProcedure


If OpenWindow(#WINMAIN, 0, 0, 500, 300, "Fenêtre principale", #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_TitleBar) <> 0 
  
  ButtonGadget(#BTN_WIN1, 10, 20, 100,30,  "Open WIN_1")        : GadgetToolTip(#BTN_WIN1,          "Ouvrir fenêtre #WIN_1")
  ButtonGadget(#BTN_WIN2, 10, 60, 100,30,  "Open WIN_2")        : GadgetToolTip(#BTN_WIN2,          "Ouvrir fenêtre #WIN_2")
  ButtonGadget(#BTN_1,    10, 100, 100,30, "Mon texte à moi")   : GadgetToolTip(#BTN_1,             "Ajouter un texte pré-établi")
  ButtonGadget(#BTN_2,    10, 140, 100,30, "Effacer tout")      : GadgetToolTip(#BTN_2,             "Effacer le contenu de l'éditeur")
  ButtonGadget(#BTN_Close_WINMAIN, 10, 180, 100,30, "Quitter")  : GadgetToolTip(#BTN_Close_WINMAIN, "Quitter ce programme")
  EditorGadget(#EDITOR_WINMAIN, 120, 20, 360, 260, #PB_Editor_ReadOnly|#PB_Editor_WordWrap)
  
;-===========================
;-PROGRAMME
;-===========================
  Repeat
    Event = WaitWindowEvent()
    
    ;-Event Gadgets
    If Event = #PB_Event_Gadget
      Select EventGadget()
          
          ;-Gadgets #WINMAIN
        Case #BTN_WIN1 : Window_N1()
          
        Case #BTN_WIN2 : Window_N2()
          
        Case #BTN_1 : AddGadgetItem(#EDITOR_WINMAIN, -1, "Je suis une phrase toute prête du style : Veuillez agréer, M. Patate, toute mon admiration pour les frites que j'ai pu manger grâce à vous ;)")
          
        Case #BTN_2 : ClearGadgetItems(#EDITOR_WINMAIN)
          
        Case #BTN_Close_WINMAIN : Quit = 1 
          
          ;-Gadgets #WIN_1
        Case #BTN_3 : AddGadgetItem(#EDITOR_WINMAIN, -1, GetGadgetText(#EDITOR_WIN_1)) : CloseWindow(#WIN_1)
          
        Case #BTN_4 :  ClearGadgetItems(#EDITOR_WIN_1) 
          
        Case #BTN_Close_WIN_1 : CloseWindow(#WIN_1)
          
          ;-Gadgets #WIN_2
        Case #BTN_5 : AddGadgetItem(#EDITOR_WINMAIN, -1, GetGadgetText(#EDITOR_WIN_2)) : CloseWindow(#WIN_2)
          
        Case #BTN_6  : ClearGadgetItems(#EDITOR_WIN_2)  
          
        Case #BTN_Close_WIN_2 : CloseWindow(#WIN_2)
          
          
       EndSelect
    EndIf
    
 ;-Fin   
    If Event = #PB_Event_CloseWindow      
      Select EventWindow() 
          
        Case #WINMAIN : Quit = 1 
          
        Case #WIN_1 : CloseWindow(#WIN_1)
          
        Case #WIN_2 : CloseWindow(#WIN_2)
          
      EndSelect 
    EndIf 
    
  Until Quit = 1
  End 
EndIf