Page 1 sur 1

MDI Gadget besoin de plus d'infos

Publié : jeu. 11/mai/2017 14:03
par Ar-S
Vu l'engoument de Marc56 pour le MDI gadget j'ai voulu me pencher dessus. Je ne l'ai en effet jamais utilisé.
Le principe me plait mais je n'arrive pas à grand chose.
En reprenant le code exemple et en le modifiant un poil, je n'obtiens pas les effets escomptés.

- Les bordures des fenêtres apparaissent alors que j'ai indiqué #PB_MDI_BorderLess
- Le redimensionnement des fenêtres filles ne se font pas lorsque je redimensionne la fenêtre mère.
- Lorsque je ferme une fenêtre fille, ça ferme le programme. Ne peut on pas choisir quelle action entreprendre lorsqu'on clôt une fenêtre fille ?

Il faudrait un code plus complet voir un tuto claire.

Si Marc56 ou quelqu'un qui a l'habitude de l'utiliser peut nous en faire un ce serait très sympa.
D'avance merci.

Voilà mon code de la doc re-manipulé. J'ai déjà ajouté des énumérations pour ne pas me perdre dans les numérotations de gadgets/fenêtres.

Code : Tout sélectionner

; Test en PB5.60x64
Enumeration fenetre
#FenetrePrincipale
#FenetreFille
#FenetreFille2
EndEnumeration

Enumeration Men
  #M1
  #M2
EndEnumeration

Enumeration
  #MDIG  
  #Bouton1
EndEnumeration



  If OpenWindow(#FenetrePrincipale, 0, 0, 800, 300, "MDIGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget)
    If CreateMenu(#FenetrePrincipale, WindowID(#FenetrePrincipale))
      MenuTitle("Index de menu 0")
      MenuTitle("Menu des fenêtres filles")
        MenuItem(#M1, "Elément auto-créé")
        MenuItem(#M2, "Elément auto-créé")
        
      MDIGadget(#MDIG, 0, 0, 0, 0, 1, 2, #PB_MDI_AutoSize|#PB_MDI_BorderLess|#PB_MDI_NoScrollBars  )
        AddGadgetItem(#MDIG, #FenetreFille, "Fenêtre fille")
          ButtonGadget(#Bouton1,0,1,200,20,"bouton1")
        AddGadgetItem(#MDIG, #FenetreFille2, "Fenêtre fille")
        
      UseGadgetList(WindowID(#FenetrePrincipale)) ; renvoie à la liste de gadgets de la fenêtre principale
    EndIf
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow
  EndIf

Re: MDI Gadget besoin de plus d'infos

Publié : jeu. 11/mai/2017 14:12
par Marc56
#PB_MDI_BorderLess ne concerne que la fenêtre mère, pas les fenêtres filles.

Il faut analyser l'exemple complet (dans la liste des exemples sur la page des gadgets)
https://www.purebasic.com/french/docume ... er.pb.html

À chaque fois qu'on change de fenêtre, il faut d'abord la sélectionner dans une liste associée.
Chaque fenêtre fille est un item d'une liste, on travaille donc avec les fonctions items et non pas fenêtre.
Chaque fenêtre fille est une fenêtre à part entière et a sa propre gadgetlist

C'est un peu compliqué à expliquer, je vais essayer de faire un mini exemple. :wink:

Re: MDI Gadget besoin de plus d'infos

Publié : jeu. 11/mai/2017 15:56
par Marc56
Voila la version simplifiée de mon EVM

Code : Tout sélectionner

EnableExplicit

Enumeration FormWindow
     #Win
EndEnumeration

Enumeration FormMenu
     #Mnu_Quit
     
     #Mnu_Add
     #Mnu_Del
     
     #Mnu_New_Win
     #Mnu_Close_All
     
     #Mnu_Cascade
     #Mnu_Tile_V
     #Mnu_Tile_H
     #Mnu_Arrange
     
     #Mnu_Next
     #Mnu_Prev
EndEnumeration


Structure Type_MDI
     ID_Win.i  ; Identifiant de la fenêtre fille
     Title.s   ; Titre de la fenêtre fille
     ID_Edt.i  ; Identifiant du gadget editor
     Text.s    ; Contenu du gadgeteditor
EndStructure

Global NewList MDI_Win.Type_MDI()

OpenWindow(#Win, 0, 0, 800, 600, "MDIGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered )
CreateStatusBar(0, WindowID(#Win))
AddStatusBarField(#PB_Ignore)

If CreateMenu(#Win, WindowID(#Win))
     MenuTitle("Fichier")
     MenuItem(#Mnu_Quit, "Quitter")
     
     MenuTitle("Fenêtres")
     MenuItem(#Mnu_New_Win,   "Nouvelle Fenêtre")
     MenuItem(#Mnu_Close_All, "Fermer les Fenêtres")
     MenuBar()
     MenuItem(#Mnu_Cascade,   "Cascade")
     MenuItem(#Mnu_Tile_V,    "Mosaïque Verticale")
     MenuItem(#Mnu_Tile_H,    "Mosaïque Horizontale")
     MenuItem(#Mnu_Arrange,   "Arranger (les fenêtres réduites)")
     MenuBar()
     MenuItem(#Mnu_Next,      "Activer Suivante")
     MenuItem(#Mnu_Prev,      "Activer Précédente")
     
     Global MDI_win = MDIGadget(#PB_Any, 0, 0, 0, 0, 1, 20, #PB_MDI_AutoSize)
     ; Ici seront générées les menus des nouvelles fenêtre
     ; Ce sera dans le menu 1 (fenêtre)
     ; Le premier ID sera 20 
EndIf



Procedure MDI_Select()
     Protected i
     ForEach MDI_Win()
          With MDI_Win()
               If \ID_Win = GetGadgetState(MDI_Win) 
                    i = ListIndex(MDI_Win())
                    SelectElement(MDI_Win(), i)
                    StatusBarText(0, 0, "#" + i + " - " + \Title)
                    ProcedureReturn 
               EndIf
          EndWith
     Next   
EndProcedure



Procedure MDI_Add(Title.s)
     Debug "MDI_Add()"
     ; Titre provisoire...
     Title = "Fenêtre " + Chr(Random(91, 65))
     LastElement(MDI_Win())
     AddElement(MDI_Win())
     Debug "Élément courant: " + ListSize(MDI_Win())         
     With MDI_Win()
          ; Créer la fenêtre fille
          \Title = Title
          \ID_Win = AddGadgetItem(MDI_Win, #PB_Any, \Title)
          ; Mettre dedans un gadget editeur ou graphique ou autre
          \ID_Edt = EditorGadget(#PB_Any, 0, 0, WindowWidth(\ID_Win), WindowHeight(\ID_Win))
          \Text = "Hello World"
          ; Met une couleur de fond aléatoire pale.
          SetGadgetColor(\ID_Edt, #PB_Gadget_BackColor,RGB(Random(255, 215), Random(255, 215), Random(255, 215)))
          SetGadgetText(\ID_Edt, \Text)
          StatusBarText(0, 0, "Nouvelle Fenêtre: " + \Title)
     EndWith
EndProcedure



Procedure Resize_All_Edt()
     ; Quand on change la forme (mosaique, cascade) il faut redim le contenu de chaque fenêtre
     If ListSize(MDI_Win())
          ForEach MDI_Win()
               With MDI_Win()
                    ResizeGadget(\ID_Edt, 0, 0, WindowWidth(\ID_Win), WindowHeight(\ID_Win))
               EndWith
          Next
     EndIf
EndProcedure


Repeat 
     Select WaitWindowEvent()
               
          Case #PB_Event_CloseWindow
               If EventWindow() = #Win
                    Debug "End"
                    Break     
               Else
                    ; Déterminer quelle est la fenêtre sélectionnée
                    MDI_Select()
                    With MDI_Win()
                         If IsWindow(\ID_Win)
                              CloseWindow(\ID_Win)
                              DeleteElement(MDI_Win())
                         EndIf
                    EndWith
               EndIf
               
          Case #PB_Event_Menu
               Select EventMenu()
                         
                    Case #Mnu_Quit
                         Break 
                         
                    Case #Mnu_New_Win
                         MDI_Add("New")
                         
                    Case #Mnu_Close_All
                         ClearGadgetItems(MDI_win) 
                         
                    Case #Mnu_Cascade
                         SetGadgetState(MDI_Win, #PB_MDI_Cascade)
                         Resize_All_Edt()
                         
                    Case #Mnu_Tile_V
                         SetGadgetState(MDI_Win, #PB_MDI_TileVertically)
                         Resize_All_Edt()
                         
                    Case #Mnu_Tile_H
                         SetGadgetState(MDI_Win, #PB_MDI_TileHorizontally) 
                         Resize_All_Edt()
                         
                    Case #Mnu_Arrange
                         SetGadgetState(MDI_Win, #PB_MDI_Arrange)
                         Resize_All_Edt()
                         
                    Case #Mnu_Next
                         SetGadgetState(MDI_Win, #PB_MDI_Next)          
                    Case #Mnu_Prev
                         SetGadgetState(MDI_Win, #PB_MDI_Previous)
               EndSelect
               
          Case #PB_Event_ActivateWindow
               ; Active une fenêtre quand on clique dedans (pas juste sur sa barre-titre)
               MDI_Select()
               
          Case #PB_Event_SizeWindow
               ; Redim d'une fenetre MDI nécessite de redim tous les gadgets internes
               MDI_Select()
               If ListSize(MDI_Win())
                    With MDI_Win()
                         ResizeGadget(\ID_Edt, 0, 0, WindowWidth(\ID_Win), WindowHeight(\ID_Win))
                    EndWith
               EndIf
               
     EndSelect
ForEver

Debug "END"

End
:!: :arrow: Il faut bien retourner dans l'aide pour chaque fonction standard (ex: GetGadgetState() )
car elle n'ont pas le même retour d'info quand elle s'adressent à un gadget MDI

Les noms de fenêtres qui vont s'ajouter au menu ont un ID de menu numérique, car il va changer à chaque ajout/suppression
il faut donc qu'il ne se mélange pas avec les enumerations, c'est pourquoi je commence à 20

Excusez le fouillis et tous les trucs en trop :wink: