Hand Made ScrollAreaGadget() [Windows]

Share your advanced PureBasic knowledge/code with the community.
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4953
Joined: Sun Apr 12, 2009 6:27 am

Hand Made ScrollAreaGadget() [Windows]

Post by RASHAD »

Hi

#1 :
- Keyboard arrow keys support
- Mouse Wheel Support

Code: Select all

Procedure vScroll()
  SetGadgetAttribute(0, #PB_ScrollArea_Y, GetGadgetState(5))
EndProcedure

Procedure hScroll()
  SetGadgetAttribute(0, #PB_ScrollArea_X ,GetGadgetState(10))
EndProcedure

ExamineDesktops() 

If OpenWindow(0, 0, 0, 610, 410, "Custom ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ScrollAreaGadget(0, 10, 10, 580,380, DesktopWidth(0),DesktopHeight(0), 25,#PB_ScrollArea_Single)
  SetGadgetColor(0,#PB_Gadget_BackColor ,$D5F5C0)
  ShowScrollBar_(GadgetID(0), #SB_BOTH, 0)
  
  ButtonGadget  (1, 110, 150, 90, 90,"Button 1")
  ButtonGadget  (2, 210, 150, 90, 90,"Button 2")
  ButtonGadget  (3, 310, 150, 90, 90,"Button 3")     
  CloseGadgetList()
  
  ScrollBarGadget(5, 590,10, 10,GadgetHeight(0), 0,400,10, #PB_ScrollBar_Vertical)
  
  ScrollBarGadget(10, 10,390, GadgetWidth(0),10, 0,600,10) 
  
  BindGadgetEvent(5,@vScroll())
  BindGadgetEvent(10,@hScroll()) 
  
  GetCursorPos_(p.POINT)
  SetCursorPos_(GadgetX(0,#PB_Gadget_ScreenCoordinate )+10,GadgetY(0,#PB_Gadget_ScreenCoordinate )+10)
  mouse_event_(#MOUSEEVENTF_LEFTDOWN,0,0,0,0)
  mouse_event_(#MOUSEEVENTF_LEFTUP,0,0,0,0)
  SetCursorPos_(p\x,p\y)
  Repeat
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
        
      Case #WM_MOUSEWHEEL  
        SetGadgetState(5,GetGadgetAttribute(0, #PB_ScrollArea_Y))
        
      Case  #PB_Event_Gadget
        Select EventGadget()
          Case 0
            SetGadgetState(5,GetGadgetAttribute(0, #PB_ScrollArea_Y))
            SetGadgetState(10,GetGadgetAttribute(0, #PB_ScrollArea_X))
          Case 1
            MessageRequester("Info","Button 1 was pressed!",#PB_MessageRequester_Ok)
          Case 2
            MessageRequester("Info","Button 2 was pressed!",#PB_MessageRequester_Ok)
          Case 3
            MessageRequester("Info","Button 3 was pressed!",#PB_MessageRequester_Ok)
        EndSelect
    EndSelect
  ForEver
EndIf

#2 :

Code: Select all

Global xNewPos,xCurrentScroll,yNewPos,yCurrentScroll,Brush

Procedure WndProc(hwnd, uMsg, wParam, lParam)
  
  If IsGadget(0)
    xCurrentScroll = GetGadgetAttribute(0,#PB_ScrollArea_X) 
    yCurrentScroll = GetGadgetAttribute(0,#PB_ScrollArea_Y) 
  EndIf
  
  Result = #PB_ProcessPureBasicEvents
  
  Select uMsg
      
    Case #WM_HSCROLL
      
      Select wParam & $FFFF
          
        Case #SB_PAGEUP 
          xNewPos = xCurrentScroll - 1
          
        Case #SB_PAGEDOWN
          xNewPos = xCurrentScroll + 1
          
        Case #SB_LINEUP 
          xNewPos = xCurrentScroll - 1
          
        Case #SB_LINEDOWN 
          xNewPos = xCurrentScroll + 1
          
        Case #SB_THUMBPOSITION 
          xNewPos = wParam >> 16 & $FFFF
          
      EndSelect
      
      SetGadgetAttribute(0,#PB_ScrollArea_X,xNewPos)
      SetGadgetState(10,xNewPos)
      
    Case #WM_VSCROLL
      
      Select wParam & $FFFF
          
        Case #SB_PAGEUP 
          yNewPos = yCurrentScroll - 1
          
        Case #SB_PAGEDOWN
          yNewPos = yCurrentScroll + 1
          
        Case #SB_LINEUP 
          yNewPos = yCurrentScroll - 1
          
        Case #SB_LINEDOWN 
          yNewPos = yCurrentScroll + 1
          
        Case #SB_THUMBPOSITION 
          yNewPos = wParam >> 16 & $FFFF
          
      EndSelect
      
      SetGadgetAttribute(0,#PB_ScrollArea_Y,yNewPos)
      SetGadgetState(5,yNewPos)
      
      
    Case #WM_CTLCOLORSCROLLBAR
      Result = Brush
      
  EndSelect
  
  ProcedureReturn Result
EndProcedure

ExamineDesktops() 

If OpenWindow(0, 0, 0, 610, 410, "Custom ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ScrollAreaGadget(0, 10, 10, 580,380, DesktopWidth(0),DesktopHeight(0), 25,#PB_ScrollArea_Single)
  SetGadgetColor(0,#PB_Gadget_BackColor ,$D5F5C0)
  ShowScrollBar_(GadgetID(0), #SB_BOTH, 0)
  SetWindowLongPtr_(GadgetID(0), #GWL_STYLE, GetWindowLongPtr_(GadgetID(0), #GWL_STYLE) | #WS_CLIPSIBLINGS)
  SetWindowPos_(GadgetID(0), #HWND_BOTTOM	, -1, -1, -1, -1, #SWP_NOSIZE | #SWP_NOMOVE)
  ButtonGadget  (1, 110, 150, 90, 90,"Button 1")
  ButtonGadget  (2, 210, 150, 90, 90,"Button 2")
  ButtonGadget  (3, 310, 150, 90, 90,"Button 3")     
  CloseGadgetList()
  
  ScrollBarGadget(5, 590,10, 10,GadgetHeight(0), 0,400,10, #PB_ScrollBar_Vertical)
  
  ScrollBarGadget(10, 10,390, GadgetWidth(0),10, 0,600,10)
  
  Brush = CreateSolidBrush_($000000)
  SetWindowCallback(@WndProc())  
  
  Repeat
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
      Case  #PB_Event_Gadget
        Select EventGadget()
          Case 1
            MessageRequester("Info","Button 1 was pressed!",#PB_MessageRequester_Ok)
          Case 2
            MessageRequester("Info","Button 2 was pressed!",#PB_MessageRequester_Ok)
          Case 3
            MessageRequester("Info","Button 3 was pressed!",#PB_MessageRequester_Ok)
        EndSelect
    EndSelect
  ForEver
  DeleteObject_(Brush)
EndIf

Egypt my love
User avatar
ChrisR
Addict
Addict
Posts: 1466
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Hand Made ScrollAreaGadget() [Windows]

Post by ChrisR »

Great :)
I especially played with your code #1, which is superbe, simple (once read) and works well 8)

I don't really like interfering and you may do it in a different way...
I added the Scroll Step for the arrow buttons, otherwise they only move forward 1 by 1.

Code: Select all

Macro ScrollStep(Step)
  Select NewState - LastState
    Case 1
      NewState + Step - 1
    Case -1
      NewState - Step + 1
  EndSelect
  LastState = NewState
EndMacro

Procedure vScroll()
  Protected NewState = GetGadgetState(10)
  Static LastState
  ScrollStep(DesktopUnscaledY(GetGadgetAttribute(0, #PB_ScrollArea_ScrollStep)))
  SetGadgetState(10, NewState)
  SetGadgetAttribute(0, #PB_ScrollArea_Y, NewState)
EndProcedure

Procedure hScroll()
  Protected NewState = GetGadgetState(11)
  Static LastState
  ScrollStep(DesktopUnscaledX(GetGadgetAttribute(0, #PB_ScrollArea_ScrollStep)))
  SetGadgetState(11, NewState)
  SetGadgetAttribute(0, #PB_ScrollArea_X ,NewState)
EndProcedure

If OpenWindow(0, 0, 0, 610, 410, "Custom ScrollAreaGadget", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ScrollAreaGadget(0, 10, 10, 580, 380, 1160, 760, 25, #PB_ScrollArea_Single)
  SetGadgetColor(0, #PB_Gadget_BackColor ,$D5F5C0)
  ShowScrollBar_(GadgetID(0), #SB_BOTH, 0)
  
  ButtonGadget(1, 110, 150, 90, 90, "Button 1")
  ButtonGadget(2, 210, 150, 90, 90, "Button 2")
  ButtonGadget(3, 310, 150, 90, 90, "Button 3")
  
  ButtonGadget(4, 600, 400, 90, 90, "Button 4")
  ButtonGadget(5, GetGadgetAttribute(0, #PB_ScrollArea_InnerWidth)-90-1, GetGadgetAttribute(0, #PB_ScrollArea_InnerHeight)-90-1, 90, 90, "Button 5")
  CloseGadgetList()
  
  PageLength = 50
  ScrollBarGadget(10, GadgetX(0)+GadgetWidth(0), GadgetY(0), 10, GadgetHeight(0), 0, GetGadgetAttribute(0, #PB_ScrollArea_InnerHeight)-GadgetHeight(0)+PageLength, PageLength, #PB_ScrollBar_Vertical)
  ScrollBarGadget(11, GadgetX(0), GadgetY(0)+GadgetHeight(0), GadgetWidth(0), 10, 0, GetGadgetAttribute(0, #PB_ScrollArea_InnerWidth) -GadgetWidth(0) +PageLength, PageLength) 
  FrameGadget(12, GadgetX(0), GadgetY(0), GadgetWidth(0)+GadgetWidth(10)+1, GadgetHeight(0)+GadgetHeight(11)+1, "", #PB_Frame_Flat)
  
  BindGadgetEvent(10, @vScroll())
  BindGadgetEvent(11, @hScroll()) 
  
  Repeat
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
        
      Case #WM_MOUSEWHEEL  
        SetGadgetState(10, GetGadgetAttribute(0, #PB_ScrollArea_Y))
        PostEvent(#PB_Event_Gadget, 0, 10)   ; To save Static LastState 
        
      Case  #PB_Event_Gadget
        Select EventGadget()
          Case 0
            SetGadgetState(10, GetGadgetAttribute(0, #PB_ScrollArea_Y))
            PostEvent(#PB_Event_Gadget, 0, 10)   ; To save Static LastState
            SetGadgetState(11, GetGadgetAttribute(0, #PB_ScrollArea_X))
            PostEvent(#PB_Event_Gadget, 0, 11)   ; To save Static LastState
          Case 1 To 5
            MessageRequester("Info", GetGadgetText(EventGadget()) + " was pressed!", #PB_MessageRequester_Ok)
            
        EndSelect
    EndSelect
  ForEver
EndIf
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4953
Joined: Sun Apr 12, 2009 6:27 am

Re: Hand Made ScrollAreaGadget() [Windows]

Post by RASHAD »

Hi ChrisR
Thanks for the addition :D
Egypt my love
User avatar
ChrisR
Addict
Addict
Posts: 1466
Joined: Sun Jan 08, 2017 10:27 pm
Location: France

Re: Hand Made ScrollAreaGadget() [Windows]

Post by ChrisR »

You're welcome, just a few second-hand additions :wink:
Post Reply