ScrollAreaGadget et #WM_VSCROLL

Sujets variés concernant le développement en PureBasic
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

ScrollAreaGadget et #WM_VSCROLL

Message 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 
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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  
Dernière modification par nico le dim. 12/sept./2004 16:28, modifié 2 fois.
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message par Le Soldat Inconnu »

Très intéressant comme code :D
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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! :?

:)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message 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 :)
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Message 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. :)
Dräc
Messages : 526
Inscription : dim. 29/août/2004 0:45

Message par Dräc »

nico a écrit : C'est exactement ça et j'en ai plusieurs. :)
De quoi faire de beaux rèves... :lol:
Répondre