Page 1 sur 1

[Résolu]MDI : Obtenir la fenêtre fille active

Publié : mer. 04/juil./2007 18:23
par Ollivier
Salut à tous, voici le code utilisant le MDI:

Code : Tout sélectionner

#Win_Ppe = 0
#Menu_Ppe = 0
#Item_Quitter = 0
#Item_nProjet = 1
#Item_fProjet = 2
#Item_MDI = 16 ; jusqu'à 31 ! ! !
#Gad_MDI = 0
#Gad_MDI2 = 1

Dim ProjectID(15)
Dim ProjectName$(15)

  If InitSprite()
    WinOpt = #PB_Window_SystemMenu
    WinOpt | #PB_Window_ScreenCentered
    WinOpt | #PB_Window_SizeGadget
    WinOpt | #PB_Window_MinimizeGadget
    WinOpt | #PB_Window_MaximizeGadget
    If OpenWindow(#Win_Ppe, 0, 0, 800, 600, "MDI", WinOpt)
      If CreateMenu(#Menu_Ppe, WindowID(#Win_Ppe)) And CreateGadgetList(WindowID(#Win_Ppe))
        MenuTitle("Projet")
          MenuItem(#Item_nProjet, "Nouveau")
          MenuBar()
          MenuItem(#Item_fProjet, "Fermer")
          MenuBar()
          MenuItem(#Item_Quitter, "Quitter")
          MDIGadget(#Gad_MDI, 0, 0, 0, 0, 0, #Item_MDI, #PB_MDI_AutoSize)    
          CreateGadgetList(WindowID(#Gad_MDI)) 
          UseGadgetList(WindowID(#Win_Ppe)) ; retourne à la liste de gadgets de la fenêtre principale
        ;FinMenu
        Repeat
          n = 0
          For i = 0 To 15
            If ProjectName$(i) <> ""
              n = n + 1
            EndIf
          Next i      
          DisableMenuItem(#Menu_Ppe, 2, n XOr 1)
          DisableMenuItem(#Menu_Ppe, 1, (16 - n) XOr 1)
          Select WaitWindowEvent()
            Case #PB_Event_Menu
              Select EventMenu()
                Case #Item_nProjet
                  i = 0
                  Name$ = ""
                  Repeat
                    If ProjectName$(i) = ""
                      ProjectName$(i) = "Projet " + Str(i + 1) + " (caduque)"
                      Name$ = ProjectName$(i)
                      ID = i
                      i = 15
                    EndIf
                    i + 1
                  Until (i > 15)
                  If Name$ <> ""
                    n = AddGadgetItem(#Gad_MDI, -1, Name$)
                    CreateGadgetList(WindowID(#Gad_MDI) )
                    ProjectID(ID) = n
                  Else
                    MessageRequester("Attention!", "Nombre maximum de fenêtre atteint", #PB_MessageRequester_Ok)
                  EndIf
                Case #Item_fProjet
                  ;Debug Str(GetActiveGadget() )
                  ;Debug Str(GetActiveWindow() )
                  Debug(GetGadgetState(#Gad_MDI) )
                  ;For i = 0 To 15
                  ;  If Window = ProjectID(i)
                  ;    ProjectName$(i) = ""
                  ;  EndIf
                  ;Next i
                  CloseWindow(Window)
                Case #Item_Quitter
                  End
              EndSelect
            Case #PB_Event_CloseWindow
              Window = EventWindow()
              If Window = #Win_Ppe
                End
              Else
                CloseWindow(Window)
                For i = 0 To 15
                  If Window = ProjectID(i)
                    ProjectName$(i) = ""
                  EndIf
                Next i
              EndIf            
          EndSelect
        ForEver
      EndIf      
    EndIf  
  Else
    Message$ = "Impossible d'initialiser l'affichage graphique" + Chr(10)
    Message$ + "Les causes de cette erreur sont :" + Chr(10) + Chr(10)
    Message$ + "- Impossible d'initialiser Direct 7 ou supérieur"
    MessageRequester("Erreur d'initialisation", Message$, #PB_MessageRequester_Ok)
  EndIf

Mon problème est le suivant: je n'arrive pas à fermer la fenêtre fille active quand je clique dans le menu MDI > Fermer.

Quelqu'un connait la bonne instruction à insérer là où il y a plein de point-virgules?

Publié : mer. 04/juil./2007 18:45
par Flype
hello,


dans ta condition tu remplace avec qq chose comme çà :

Code : Tout sélectionner

              Case #Item_fProjet
                
                If GetGadgetState(#Gad_MDI) <> -1
                  
                  CloseWindow(GetGadgetState(#Gad_MDI))
                  
                  If Not CountGadgetItems(#Gad_MDI)
                    DisableMenuItem(#Menu_Ppe, #Item_fProjet, #True)
                  EndIf
                  
                EndIf

Publié : mer. 04/juil./2007 18:54
par Ollivier
Weuh! J'ai rien compris mais ça marche. 8O

Merci Flype!

Publié : mer. 04/juil./2007 19:03
par venom
arf... :? .

j'ai trouve comme sa fin si c'est sa que tu chercher :lol:

@++

Publié : mer. 04/juil./2007 19:07
par venom
zut :lol: sa ne fonctionne pas ma technique de Mc Giver :lol: .


@++

Publié : mer. 04/juil./2007 19:14
par Ollivier
:o venonn...

J'ai rectifié le code avec la patte de flype alors ne perds pas trop de temps!

Code : Tout sélectionner

#Win_Ppe = 0
#Menu_Ppe = 0
#Item_Quitter = 0
#Item_nProjet = 1
#Item_fProjet = 2
#Item_MDI = 16 ; jusqu'à 31 ! ! !
#Gad_MDI = 0

Dim ProjectID(15)
Dim ProjectName$(15)

  If InitSprite()
    WinOpt = #PB_Window_SystemMenu
    WinOpt | #PB_Window_ScreenCentered
    WinOpt | #PB_Window_SizeGadget
    WinOpt | #PB_Window_MinimizeGadget
    WinOpt | #PB_Window_MaximizeGadget
    If OpenWindow(#Win_Ppe, 0, 0, 800, 600, "MDI", WinOpt)
      If CreateMenu(#Menu_Ppe, WindowID(#Win_Ppe)) And CreateGadgetList(WindowID(#Win_Ppe))
        MenuTitle("Projet")
          MenuItem(#Item_nProjet, "Nouveau")
          MenuBar()
          MenuItem(#Item_fProjet, "Fermer")
          MenuBar()
          MenuItem(#Item_Quitter, "Quitter")
          MDIGadget(#Gad_MDI, 0, 0, 0, 0, 0, #Item_MDI, #PB_MDI_AutoSize)    
          CreateGadgetList(WindowID(#Gad_MDI)) 
          UseGadgetList(WindowID(#Win_Ppe)) ; retourne à la liste de gadgets de la fenêtre principale
        ;FinMenu
        Repeat
          n = 0
          For i = 0 To 15
            If ProjectName$(i) <> ""
              n = n + 1
            EndIf
          Next i      
          DisableMenuItem(#Menu_Ppe, 2, n XOr 1)
          DisableMenuItem(#Menu_Ppe, 1, (16 - n) XOr 1)
          Select WaitWindowEvent()
            Case #PB_Event_Menu
              Select EventMenu()
                Case #Item_nProjet
                  i = 0
                  Name$ = ""
                  Repeat
                    If ProjectName$(i) = ""
                      ProjectName$(i) = "Projet " + Str(i + 1) + " (caduque)"
                      Name$ = ProjectName$(i)
                      ID = i
                      i = 15
                    EndIf
                    i + 1
                  Until (i > 15)
                  If Name$ <> ""
                    n = AddGadgetItem(#Gad_MDI, -1, Name$)
                    ;CreateGadgetList(WindowID(#Gad_MDI) )
                    ProjectID(ID) = n
                  Else
                    MessageRequester("Attention!", "Nombre maximum de fenêtre atteint", #PB_MessageRequester_Ok)
                  EndIf
                Case #Item_fProjet
                  If GetGadgetState(#Gad_MDI) <> -1                                       
                    n = GetGadgetState(#Gad_MDI)
                    For i = 0 To 15
                      If n = ProjectID(i)                      
                        ProjectName$(i) = ""                        
                      EndIf
                    Next
                    CloseWindow(n)                 
                  EndIf 
                Case #Item_Quitter
                  End
              EndSelect
            Case #PB_Event_CloseWindow
              Window = EventWindow()
              If Window = #Win_Ppe
                End
              Else
                CloseWindow(Window)
                For i = 0 To 15
                  If Window = ProjectID(i)
                    ProjectName$(i) = ""
                  EndIf
                Next i
              EndIf            
          EndSelect
        ForEver
      EndIf      
    EndIf  
  Else
    Message$ = "Impossible d'initialiser l'affichage graphique" + Chr(10)
    Message$ + "Les causes de cette erreur sont :" + Chr(10) + Chr(10)
    Message$ + "- Impossible d'initialiser Direct 7 ou supérieur"
    MessageRequester("Erreur d'initialisation", Message$, #PB_MessageRequester_Ok)
  EndIf
Par contre, si quelqu'un peut m'expliquer pourquoi il y a cette "pause" où GetGadgetStat() se retrouve à -1 avant de pouvoir fournir le n° de la fenêtre active, ça me permettrait d'apprendre une logique qui n'a pas l'air indiqué dans l'air de PB.

Publié : ven. 06/juil./2007 3:13
par Ollivier
Boah je cherche pas trop à comprendre finalement. Je constate que pour les gadgets c'est pareil.
XLC