Page 1 sur 1

ScrollAreaGadget et #WM_VSCROLL

Publié : dim. 12/sept./2004 11:31
par Dräc
Bonjour,

En complément du post suivant :
http://purebasic.hmt-forum.com/viewtopi ... tscrollpos
...comment récupérer l’événement d’un déplacement de la barre verticale ou horizontale d’un gadget container ?
Par exemple, l’événement #WM_VSCROLL est sensé etre émis pour toute manipulation d’une barre vertical de scroll, non ?
Cela a t’il un rapport avec le fait que PB gère les barres de scroll lui-meme ? (filtrage ?)

Code : Tout sélectionner

InitSprite()

Procedure WindowCallback(WindowID, Message, wParam, lParam)
Result = #PB_ProcessPureBasicEvents;Result= DefWindowProc_(WindowID, Message, wParam, lParam)

;Debug Str(message)+" / "+Str(#WM_VSCROLL)
    Select Message
      Case #WM_VSCROLL; Gestion de la barre verticale
        Debug "#WM_VSCROLL"
        Debug WindowID
    EndSelect

ProcedureReturn Result 
EndProcedure

If OpenWindow(0,0,0,400,300,#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget,"Window") 
  SetWindowCallback(@WindowCallback())
  If CreateGadgetList(WindowID(0)) 

    ScrollAreaGadget (1,10,10,200,200,500,400,10)
    hCont = ContainerGadget(2,10,10,500,400,#PB_Container_Double)
    CloseGadgetList()

    If OpenWindowedScreen( hCont, 0, 0, 500, 400, 0, 0, 0 ) = 0 
      MessageRequester( "Erreur" , "Impossible d'ouvrir l'écran " , 0 ) 
      End 
    EndIf 
  EndIf 
  
  If CreateSprite(1000,24,24) 
    StartDrawing(SpriteOutput(1000)) 
    Box(0,0,24,24,RGB($0,$0,$FF)) 
    StopDrawing() 
  EndIf 
  
  Dep = 8 
  
  Repeat 
    
    ClearScreen(0,155,255) 
        DisplaySprite(1000, x, 100) 
    
    x + Dep 
    If x >=300 Or x <=0 : Dep = -Dep : EndIf 
    FlipBuffers()

  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf 

Publié : dim. 12/sept./2004 13:17
par Le Soldat Inconnu
je vois que ça :

Code : Tout sélectionner

Global hCont

Procedure WindowCallback(WindowID, Message, wParam, lParam)
  Result = #PB_ProcessPureBasicEvents ; Result= DefWindowProc_(WindowID, Message, wParam, lParam)
  
  ; Debug Str(Message)+" / "+Str(#WM_VSCROLL)
  If WindowID = hCont
    Select Message
      Case #WM_PAINT
        Debug "#WM_PAINT"
    EndSelect
  EndIf
  
  ProcedureReturn Result
EndProcedure

If OpenWindow(0, 0, 0, 400, 300, #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget | #PB_Window_MaximizeGadget, "Window")

  If CreateGadgetList(WindowID(0))
    
    hCont = ScrollAreaGadget (1, 10, 10, 200, 200, 500, 400, 10)
      ; ContainerGadget(2,10,10,500,400,#PB_Container_Double)
    CloseGadgetList()
  EndIf
  
  SetWindowCallback(@WindowCallback())
  
  Repeat
    
  Until WindowEvent() = #PB_Event_CloseWindow
EndIf

Publié : dim. 12/sept./2004 15:53
par Dräc
J’achète! Merci Soldat !

Cependant je laisse mariner un peu cette question pour voir si d’autres trouvent une solution « propre ».
Après je pense le faire remonter dans les suggestions/améliorations

Publié : dim. 12/sept./2004 15:58
par nico

Code : Tout sélectionner

;nico

Global Valeur_Deplacement

Procedure NouvelleProc( hWnd, Msg,  wParam, lParam) 
  ;Ici on récupère l'adresse d'origine de la procédure grâce à la 
  ;chaine qui l'identifie: "OriginProc" et le handle de la fenêtre 
  ;voir la fonction SetProp. 
  OriginProc.l= GetProp_(hWnd, "OriginProc") 
  Select Msg 
    Case #WM_VSCROLL; Gestion de la barre verticale
      ;Debug lParam  ;Handle du scrollbar
      loword = wParam & $FFFF
          Select loword
            Case #SB_LINEDOWN
              ;On traite nous-même ce message
              Position= GetScrollPos_(GadgetID(0),#SB_VERT) 
              SetScrollPos_(GadgetID(0),#SB_VERT,Position + Valeur_Deplacement ,1)
              Debug "barre vertical= "+Str(GetScrollPos_(GadgetID(0),#SB_VERT))
              ProcedureReturn 0
               
            Case #SB_LINEUP
              ;On traite nous-même ce message
              Position= GetScrollPos_(GadgetID(0),#SB_VERT) 
              SetScrollPos_(GadgetID(0),#SB_VERT,Position - Valeur_Deplacement ,1)
              Debug "barre vertical= "+Str(GetScrollPos_(GadgetID(0),#SB_VERT))
              ProcedureReturn 0
              
            Case #SB_PAGEDOWN
              ;impossible d'utiliser ce message

            Case #SB_PAGEUP 
              ;impossible d'utiliser ce message
              
            Case #SB_THUMBPOSITION  
              Debug "barre vertical= "+Str(wParam >> 16) ;donne la position du déplacement
              
            Case # SB_THUMBTRACK
              
          EndSelect
          
          
        Case #WM_HSCROLL; Gestion de la barre horizontal
          ;Debug lParam  ;Handle du scrollbar
          loword = wParam & $FFFF
          Select loword
            Case #SB_LINEDOWN
              ;On traite nous-même ce message
              Position= GetScrollPos_(GadgetID(0),#SB_HORZ) 
              SetScrollPos_(GadgetID(0),#SB_HORZ,Position + Valeur_Deplacement ,1)
              Debug "barre horizontal= "+Str(GetScrollPos_(GadgetID(0),#SB_HORZ))
              ProcedureReturn 0
              
            Case #SB_LINEUP
              ;On traite nous-même ce message
              Position= GetScrollPos_(GadgetID(0),#SB_HORZ) 
              SetScrollPos_(GadgetID(0),#SB_HORZ,Position - Valeur_Deplacement ,1)
              Debug "barre horizontal= "+Str(GetScrollPos_(GadgetID(0),#SB_HORZ))
              ProcedureReturn 0
              
            Case #SB_PAGEDOWN
              ;impossible d'utiliser ce message
              
            Case #SB_PAGEUP 
              ;impossible d'utiliser ce message
              
            Case #SB_THUMBPOSITION  
              Debug "barre horizontal= "+Str(wParam >> 16) ;donne la position du déplacement
              
            Case # SB_THUMBTRACK
              
          EndSelect
      
      
  EndSelect 
  ;On renvoie tous les autres évènements à la procédure d'origine. 
  ProcedureReturn CallWindowProc_(OriginProc,hWnd,Msg,wParam,lParam) 
EndProcedure    

If OpenWindow(0,0,0,600,400,#PB_Window_SystemMenu|#PB_Window_ScreenCentered,"StringGadget Flags") And CreateGadgetList(WindowID(0)) 
  Valeur_Deplacement=10
  hscroll=ScrollAreaGadget(0, 10, 10,400,120, 600, 300, 2)
  ;Normalement la valeur de depacement ici est 2, mais elle ne sera pas pris en compte.

  ButtonGadget  (1, 10, 10,230, 30,"Button 1") 
  ButtonGadget  (2, 50, 50,230, 30,"Button 2") 
  ButtonGadget  (3, 90, 90,230, 30,"Button 3") 
  TextGadget    (4,130,130,230, 20,"This is the content of a ScrollAreaGadget!",#PB_Text_Right) 
  CloseGadgetList()
   
  ;Avec cette fonction, on récupère l'adresse d'origine de la procédure 
  ;pour ensuite la restituer, une fois le traitement terminé. 
  OriginProc = SetWindowLong_(GadgetID(0), #GWL_WNDPROC, @NouvelleProc()) 
  
  ;Cette fonction est très utile car elle permet d'associer une nouvelle donnée 
  ;à n'importe quelles fenêtres crées en utlisant une chaine de caractère pour 
  ;l'identification; ça évite d'utiliser une valeur globale. 
  ;Ici on associe la valeur OriginProc identifiée par la chaine "OriginProc" 
  ;au ScrollGadget 
  SetProp_(GadgetID(0), "OriginProc", OriginProc) 
  
  Repeat 
    EventID = WaitWindowEvent() 
    Select EventID 
      Case  #PB_EventGadget 
        Select EventGadgetID() 
          Case 0 
            Debug "Normal StringGadget" 
            
          Case 1            
            MessageRequester("Info","Bouton 1 cliqué")
        EndSelect 
        
      Case #WM_CLOSE 
        ;Supprimer avant fermeture du programme la donnée associée à la fenêtre. 
        RemoveProp_(GadgetID(0),"OriginProc") 
        Quit=1 
        
    EndSelect 
    
  Until Quit=1 
EndIf  

Publié : dim. 12/sept./2004 16:17
par Le Soldat Inconnu
Très intéressant comme code :D

Publié : dim. 12/sept./2004 19:10
par nico
Ouais, mais je ne suis pas arriver à gérer le PAGEDOWN et le PAGEUP.
J'arrive à le simuler, le scrollbar réagit mais pas les gadgets à l'intérieur.

En tout cas, c'est dommage d'avoir ce gadget et pas les commandes qui vont avec! :?

:)

Publié : dim. 12/sept./2004 22:26
par Dräc
Bravo !
Ton livre de chevet c’est l’API Window ?!

On pourra certes regretter que l’on ne puisse accéder à ces paramètres plus simplement, limitant du même coup la portabilité, mais je ne suis plus à une API prés maintenant :)

Publié : dim. 12/sept./2004 22:30
par nico
Dräc a écrit :Bravo !
Ton livre de chevet c’est l’API Window ?!
C'est exactement ça et j'en ai plusieurs. :)

Publié : dim. 12/sept./2004 22:52
par Dräc
nico a écrit : C'est exactement ça et j'en ai plusieurs. :)
De quoi faire de beaux rèves... :lol: