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

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
