Page 1 sur 1

Au sujet des fenêtres modales

Publié : jeu. 30/août/2007 11:16
par Doctor-B
J'arrives pas a rendre une fenêtre modale comme ceci :

=>Fenetre princiapale=>Clique sur un item du menu=>Ouvre une fenêtre mais sans fermer la fenetre de base

C'est possible de faire ca ??

Publié : jeu. 30/août/2007 12:08
par Jacobus
Un exemple parmi d'autres :
Une fois compilé clic sur la surface de la fenêtre principale pour voir ce qu'il se passe. Ensuite fais un essai en changeant les deux fonctions HideWindow() et DisableWindow() (décommente la première et commente la seconde)

Code : Tout sélectionner

Enumeration
#WIN
#OpenSec
#Quit
#Win_Sec
#CloseSec
#StatusSec
EndEnumeration

Procedure Win_Sec()
 
  If OpenWindow(#Win_Sec,0,0, 400, 300,"Fenêtre secondaire ", #PB_Window_SystemMenu |#PB_Window_ScreenCentered |#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#Win_Sec))=0  
    End 
  EndIf 
  
 ; HideWindow(#WIN,1) ; cache la fenêtre principale
  DisableWindow(#WIN,1) ; désactive la fenêtre principale
      
    ButtonGadget(#CloseSec,150,125,100,25,"Fermer")
     GadgetToolTip(#CloseSec,"Fermer la fenêtre secondaire")
   
  If CreateStatusBar(#StatusSec, WindowID(#Win_Sec))
    AddStatusBarField(400)
    StatusBarText(#StatusSec,0,"Cette fenêtre supporte toutes les fonctions de PB...",#PB_StatusBar_Raised)
  EndIf 
     
  Repeat
    EventSec = WaitWindowEvent() 
    If EventSec = #PB_Event_Gadget
      Select EventGadget()            
         
       Case #CloseSec : EventSec = #PB_Event_CloseWindow
              
      EndSelect  
    EndIf 
         
  Until EventSec = #PB_Event_CloseWindow
  
  CloseWindow(#Win_Sec)
 ; HideWindow(#WIN,0)
  DisableWindow(#WIN,0)
EndProcedure       


If OpenWindow(#WIN,0,0,790,550,"Fenêtre principale" ,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#WIN))=0 
End 
EndIf
SetWindowColor(#WIN, RGB(255, 255, 255))

ButtonGadget(#OpenSec,10,10,100,25,"Ouvrir")
     GadgetToolTip(#OpenSec,"Ouvrir la fenêtre secondaire")

ButtonGadget(#Quit,680,510,100,25,"Quitter")
     GadgetToolTip(#Quit,"Fermer et quitter")
     
Repeat
  Event = WaitWindowEvent() 
    If Event = #PB_Event_Gadget
      Select EventGadget()            
        
       Case #OpenSec : Win_Sec()
       Case #Quit    : Event = #PB_Event_CloseWindow
              
      EndSelect  
    EndIf 
         
Until Event= #PB_Event_CloseWindow
End 

Publié : jeu. 30/août/2007 12:59
par Doctor-B
outch merci serieux merci de ton aide #coeur

Publié : jeu. 30/août/2007 14:39
par Doctor-B
sinon j'ai maintenant une autre question(ben quoi,newbie et fier de l'être)
c'est possible de faire ca :
on a une barre de progression standard,et 3 secondes après avoir ouvert le programme elle est a 100%,et une demie seconde après une nouvelle fenetre s'ouvre ?

Je pense gérer ca commme ceci :
Barre a 0%
3000 milisecondes plus tard
Barre entièrement remplie
500 milisecondes plus tard
Ouverture d'une nouvelle fenêtre.

Merci :wink:

Publié : jeu. 30/août/2007 16:15
par Jacobus
Une solution. Il y en a d'autres avec les timers.

Code : Tout sélectionner

Enumeration
#WIN
#OpenSec
#Progress
#Quit
#Win_Sec
#CloseSec
#StatusSec
EndEnumeration

Procedure Win_Sec()
 
  If OpenWindow(#Win_Sec,0,0, 400, 300,"Fenêtre secondaire ", #PB_Window_SystemMenu |#PB_Window_ScreenCentered |#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#Win_Sec))=0 
    End
  EndIf
 
 ; HideWindow(#WIN,1) ; cache la fenêtre principale
  DisableWindow(#WIN,1) ; désactive la fenêtre principale
     
    ButtonGadget(#CloseSec,150,125,100,25,"Fermer")
     GadgetToolTip(#CloseSec,"Fermer la fenêtre secondaire")
   
  If CreateStatusBar(#StatusSec, WindowID(#Win_Sec))
    AddStatusBarField(400)
    StatusBarText(#StatusSec,0,"Cette fenêtre supporte toutes les fonctions de PB...",#PB_StatusBar_Raised)
  EndIf
     
  Repeat
    EventSec = WaitWindowEvent()
    If EventSec = #PB_Event_Gadget
      Select EventGadget()           
         
       Case #CloseSec : EventSec = #PB_Event_CloseWindow
             
      EndSelect 
    EndIf
         
  Until EventSec = #PB_Event_CloseWindow
 
  CloseWindow(#Win_Sec)
 ; HideWindow(#WIN,0)
  DisableWindow(#WIN,0)
EndProcedure       

Procedure LoadProgress()  
   ValT = GetGadgetState(#Progress)   
     SetGadgetState(#Progress, ValT+25)               
EndProcedure 

Procedure LoadDisplay()
  LoadProgress()
  Delay(1000)     
  LoadProgress()
  Delay(1000)
  LoadProgress()
  Delay(1000)
  LoadProgress()
  Delay(1500)
  Win_Sec()
  SetGadgetState(#Progress, 0)
EndProcedure


Procedure OpenWinMain()
If OpenWindow(#WIN,0,0,790,550,"Fenêtre principale" ,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#WIN))=0
End
EndIf

SetWindowColor(#WIN, RGB(255, 255, 255))

ButtonGadget(#OpenSec,10,10,100,25,"Ouvrir")
     GadgetToolTip(#OpenSec,"Ouvrir la fenêtre secondaire")
     
ProgressBarGadget(#Progress,10,250,770,25,0,100)

ButtonGadget(#Quit,680,510,100,25,"Quitter")
     GadgetToolTip(#Quit,"Fermer et quitter")

EndProcedure

 OpenWinMain()
 CreateThread(@LoadDisplay(),0) ; le thread permet de ne pas figer la fenêtre
Repeat
  Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()           
       
       Case #OpenSec : CreateThread(@LoadDisplay(),0)
       
       Case #Quit    : Event = #PB_Event_CloseWindow
             
      EndSelect 
    EndIf
         
Until Event= #PB_Event_CloseWindow
End
  
Amuses toi bien
@+

Publié : jeu. 30/août/2007 16:39
par Doctor-B
pout les timers il faut la version complete ^^
merci pour ta soluce Image

Publié : jeu. 30/août/2007 17:01
par Jacobus
dernier point pour que ce soit plus sympa
On utilise maintenant une boucle For Next avec des valeurs différentes pour un affichage différent et plus fluide.

remplace ces deux procédures dans le code et teste. Après choisis tes valeurs

Code : Tout sélectionner

Procedure LoadProgress()  
   ValT = GetGadgetState(#Progress)   
     SetGadgetState(#Progress, ValT+1)  ; valeur changée pour le mode long ci-dessous             
EndProcedure 

Procedure LoadDisplay()
 
 For t = 1 To 100  ;tu peux modifier le nombre avec la valeur souhaitée ...
  LoadProgress()
  Delay(10)    ; ... avec moins de temps comme Delay(10) ce sera plus smooth  
 Next     
  
 ; Delay(500) ; pas nécessaire mais bon...
  
  Win_Sec()
  
  SetGadgetState(#Progress, 0)
  
EndProcedure

Publié : jeu. 30/août/2007 17:18
par Jacobus
Remise du code complet remanié auquel j'ai rajouté l'affichage du pourcentage de chargement. Simple mais pratique.

Code : Tout sélectionner

;-constantes 
Enumeration
#WIN
#OpenSec
#Progress
#TextProgress
#Quit
#Win_Sec
#CloseSec
#StatusSec
EndEnumeration

Procedure Win_Sec()
 
  If OpenWindow(#Win_Sec,0,0, 400, 300,"Fenêtre secondaire ", #PB_Window_SystemMenu |#PB_Window_ScreenCentered |#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#Win_Sec))=0 
    End
  EndIf
 
 ; HideWindow(#WIN,1) ; cache la fenêtre principale
  DisableWindow(#WIN,1) ; désactive la fenêtre principale
     
    ButtonGadget(#CloseSec,150,125,100,25,"Fermer")
     GadgetToolTip(#CloseSec,"Fermer la fenêtre secondaire")
   
  If CreateStatusBar(#StatusSec, WindowID(#Win_Sec))
    AddStatusBarField(400)
    StatusBarText(#StatusSec,0,"Cette fenêtre supporte toutes les fonctions de PB...",#PB_StatusBar_Raised)
  EndIf
     
  Repeat
    EventSec = WaitWindowEvent()
    If EventSec = #PB_Event_Gadget
      Select EventGadget()           
         
       Case #CloseSec : EventSec = #PB_Event_CloseWindow
             
      EndSelect 
    EndIf
         
  Until EventSec = #PB_Event_CloseWindow
 
  CloseWindow(#Win_Sec)
 ; HideWindow(#WIN,0)
  DisableWindow(#WIN,0)
EndProcedure       

Procedure LoadProgress()  
   ValT = GetGadgetState(#Progress)   
     SetGadgetState(#Progress, ValT+1)  ; valeur changée pour le mode long ci-dessous  
     SetGadgetText(#TextProgress, "Chargé à : "+Str(ValT)+" %")           
EndProcedure 

Procedure LoadDisplay()
 
 For t = 0 To 100  ;tu peux modifier le nombre avec la valeur souhaitée ...
  LoadProgress()
  Delay(10)    ; ... avec moins de temps comme Delay(10) ce sera plus smooth  
 Next       
  
  Win_Sec()
  
  SetGadgetState(#Progress, 0)     ; remise à zéro
  SetGadgetText(#TextProgress, "") ; remise à zéro
  
EndProcedure

Procedure OpenWinMain()
If OpenWindow(#WIN,0,0,790,550,"Fenêtre principale" ,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered|#PB_Window_TitleBar)=0 Or CreateGadgetList(WindowID(#WIN))=0
End
EndIf

ButtonGadget(#OpenSec,10,10,100,25,"Ouvrir")
     GadgetToolTip(#OpenSec,"Ouvrir la fenêtre secondaire")
     
ProgressBarGadget(#Progress,10,250,770,25,0,100)
TextGadget(#TextProgress, 330,280,110,20,"") ; pour afficher le pourcentage

ButtonGadget(#Quit,680,510,100,25,"Quitter")
     GadgetToolTip(#Quit,"Fermer et quitter")

EndProcedure

 OpenWinMain()
 CreateThread(@LoadDisplay(),0) ; le thread permet de ne pas figer la fenêtre
Repeat
  Event = WaitWindowEvent()
    If Event = #PB_Event_Gadget
      Select EventGadget()           
       
       Case #OpenSec : CreateThread(@LoadDisplay(),0)
       
       Case #Quit    : Event = #PB_Event_CloseWindow
             
      EndSelect 
    EndIf
         
Until Event= #PB_Event_CloseWindow
End
@+ :wink:

Publié : jeu. 30/août/2007 18:09
par Chris
Doctor-B a écrit :pout les timers il faut la version complete ^^
merci pour ta soluce Image
Pas forcément.
Tu peux créer ton timer avec la fonction "ElapsedMilliseconds()"

Code : Tout sélectionner

Delay(1)  ; Pour permettre au debugger de se lancer
S = 0     ; Pour l'affichage du nombre de secondes

TimeStart = ElapsedMilliseconds()

While S < 11
  
  If ElapsedMilliseconds() - TimeStart = 1000
    If S = 1 : T$ = " seconde" : Else : T$ = " secondes" : EndIf
    
    Debug "Temps écoulé = " +Str(S)  + T$ : S+1 
    TimeStart = ElapsedMilliseconds()
  EndIf
  
Wend

Publié : jeu. 30/août/2007 18:21
par Doctor-B
Chris=>certes,certes.Rien a redire,je suis newbie,vous avez des codes qui tuent merci les gars !