Page 1 sur 1

Probléme de fenêtre

Publié : ven. 05/janv./2007 19:31
par Pascal Vernie
Bonsoir à tous

Voila mon code:

Code : Tout sélectionner

Procedure Aide()
    OpenWindow(1,200,100, 100, 200,"AIDE", #PB_Window_SystemMenu )
    StartDrawing(WindowOutput(1))
    DrawText(10,10,"Ceci est l'aide")
    StopDrawing()
EndProcedure

If OpenWindow(0,100,100, 400, 300,"FENETRE PRINCIPALE", #PB_Window_SystemMenu )
    If CreateGadgetList(WindowID(0))
        ButtonGadget(0, 50, 75, 40, 20, "AIDE" ,#PB_Button_Default)
    EndIf
    
    
    Repeat 
        
        StartDrawing(WindowOutput(0)) 
        DrawText(10,10,"Mon Programme")
        Box(10,100,200,100,RGB($FF,$FF,$AE))
        StopDrawing() 
        
        EventID.l = WaitWindowEvent()
        
        If EventID = #PB_Event_Gadget
            Select EventGadget()
                Case 0
                    Aide()
            EndSelect
        EndIf
        
        If EventID = #PB_Event_CloseWindow
            If EventWindow() = 0
                fin = 1
            EndIf
            CloseWindow(EventWindow())
        EndIf
    Until fin = 1 
EndIf
End
Maintenant mon problème:
Lorsque je clique sur le bouton AIDE ma fenêtre s'affiche en effaçant une partie du texte "mon programme" et une partie du rectangle jaune, c'est normal.
Mais ou je ne trouve pas la solution c'est quand je déplace la fenêtre vers la droite mon texte et mon rectangle ne s'affichent correctement que lorsque je relache la souris.
je ne trouve pas cela trés pro, est-ce qu'il y a une solution qui rende mieux.
en vous remerciant de votre aide.
Amitiés
Pascal

Publié : ven. 05/janv./2007 20:58
par Flype
comme ceci par exemple (utilisation d'une callback) :

Code : Tout sélectionner

Procedure Aide()
  OpenWindow(1,200,100, 100, 200,"AIDE", #PB_Window_SystemMenu )
EndProcedure

Procedure MaProcedureCallback(WindowID, message, wParam, lParam)
  
  Resultat = #PB_ProcessPureBasicEvents
  
  Select message
    
    Case #WM_PAINT
      
      Select WindowID
        
        Case WindowID(0) ; PRINCIPALE
          StartDrawing(WindowOutput(0))
          DrawText(10,10,"Mon Programme")
          Box(10,100,200,100,RGB($FF,$FF,$AE))
          StopDrawing()
          
        Case WindowID(1) ; AIDE
          StartDrawing(WindowOutput(1))
          DrawText(10,10,"Ceci est l'aide")
          StopDrawing()
          
      EndSelect
      
  EndSelect
  
  ProcedureReturn Resultat
  
EndProcedure

If OpenWindow(0,100,100, 400, 300,"FENETRE PRINCIPALE", #PB_Window_SystemMenu )
  
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 50, 75, 40, 20, "AIDE" ,#PB_Button_Default)
  EndIf
  
  SetWindowCallback(@MaProcedureCallback()) ; <----------------- CALLBACK POUR WM_PAINT --------<<<
  
  Repeat
    
    EventID.l = WaitWindowEvent()
    
    Select EventID
      
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            Aide()
        EndSelect
        
      Case #PB_Event_CloseWindow
        If EventWindow() = 0
          fin = 1
        EndIf
        CloseWindow(EventWindow())
        
    EndSelect
    
  Until fin = 1
  
EndIf
End 

Publié : ven. 05/janv./2007 21:01
par Flype
ou alors tu dessines tous tes tracés dans une image grace à ImageOutPut(0) au lieu de WindowOutput(0).
et enfin tu utilises l'image dans un ImageGadget() et ca devra être bon.

Publié : ven. 05/janv./2007 21:39
par Pascal Vernie
Merci Flype
Je vais essayer de comprendre les callback, que je ne connaissais pas .
C'est exactement ce qoe je voulais, cela a une autre "gueule" que mon prog, là c'est pro. J'ai décidement encore beaucoup à apprendre ......
Merci encore.
Pascal

Publié : ven. 05/janv./2007 22:01
par Dr. Dri
ou tout simplement sans callback (pk toujours ce réflexe ?)

Code : Tout sélectionner

Procedure Aide()
  OpenWindow(1,200,100, 100, 200,"AIDE", #PB_Window_SystemMenu )
EndProcedure

If OpenWindow(0,100,100, 400, 300,"FENETRE PRINCIPALE", #PB_Window_SystemMenu )
 
  If CreateGadgetList(WindowID(0))
    ButtonGadget(0, 50, 75, 40, 20, "AIDE" ,#PB_Button_Default)
  EndIf
 
  Repeat
   
    EventID.l = WaitWindowEvent()
   
    Select EventID
     
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            Aide()
        EndSelect
      
      Case #WM_PAINT
     
        Select EventWindow()
         
          Case 0 ; PRINCIPALE
            StartDrawing(WindowOutput(0))
            DrawText(10,10,"Mon Programme")
            Box(10,100,200,100,RGB($FF,$FF,$AE))
            StopDrawing()
           
          Case 1 ; AIDE
            StartDrawing(WindowOutput(1))
            DrawText(10,10,"Ceci est l'aide")
            StopDrawing()
           
        EndSelect
       
      Case #PB_Event_CloseWindow
        If EventWindow() = 0
          fin = 1
        EndIf
        CloseWindow(EventWindow())
       
    EndSelect
   
  Until fin = 1
 
EndIf
End 
Dri

Publié : ven. 05/janv./2007 22:18
par Pascal Vernie
Merci pour ta réponse Dr. Dri, mais désolé ton Prog donne le même résultat que le mien, alors que celui de Flype n'efface pas le contenu de la fenêtre principale.
Amitiés.
Pascal

Publié : ven. 05/janv./2007 23:53
par Flype
Dr. Dri a écrit :ou tout simplement sans callback (pk toujours ce réflexe ?)
réflexe oui et non - çà dépend.
en l'occurrence ici çà permet d'intercepter les évènements
meme quand un autre évènement bloque la boucle purebasic.