- Speedy Hal & Val Scrolling
- Can use more CheckBoxes Columns
- Can use any other objects smoothly
Have fun
Code: Select all
#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT 
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT 
Global Header,oldproc,Header_H,Index
Global w.RECT,rc.RECT,lv.RECT
ExamineDesktops()
Procedure Hheight(hwnd, msg, wParam, lParam)
  result = CallWindowProc_(oldproc, hwnd, msg, wParam, lParam)
  Select msg            
            
      Case #HDM_LAYOUT        
        *hdlayout.HD_LAYOUT = lParam
        If *hdlayout\prc <> 0
            *rect.RECT = *hdlayout\prc
            *rect\top = 40
        EndIf
        If *hdlayout\pwpos <> 0
            *windowpos.WINDOWPOS = *hdlayout\pwpos
            *windowpos\cy = 40
        EndIf
    
    EndSelect
    ProcedureReturn result
  EndProcedure
  
Procedure WndProc(hwnd, uMsg, wParam, lParam)
result = #PB_ProcessPureBasicEvents 
Select uMsg
   
  Case #WM_NOTIFY   
    *NMHDR.NMHDR = lParam    
    
      Select *NMHDR\code 
        Case #NM_CUSTOMDRAW 
         *LVCDHeader.NMLVCUSTOMDRAW = lParam
          Select *LVCDHeader\nmcd\dwDrawStage 
            Case #CDDS_PREPAINT 
               ;result = #CDRF_NOTIFYITEMDRAW                
            Case #CDDS_ITEMPREPAINT
               result = #CDRF_NOTIFYSUBITEMDRAW
            Case #CDDS_SUBITEMPREPAINT 
                Row = *LVCDHeader\nmcd\dwItemSpec
                If Row & 1 = 0 
                  *LVCDHeader\clrTextBk = $D6FFFF 
                Else 
                  *LVCDHeader\clrTextBk = $CEF6F5 
                EndIf            
                    result = #CDRF_NEWFONT 
          EndSelect 
      EndSelect     
      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING
          If *nmHEADER\iItem = 0 Or *nmHEADER\iItem = 1 
            HideGadget(2,1)
            HideGadget(3,1)
          EndIf
            
            
        Case #HDN_ITEMCHANGED
          r1.RECT\top = 1
          r1.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, r1)
          r2.RECT\top = 2
          r2.RECT\left = #LVIR_BOUNDS
          SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 2, r2)
          If r1\left > 0
            MoveWindow_(GadgetID(2),r1\left+1,Header_H,20,lv\bottom - lv\top,1)
          EndIf
          MoveWindow_(GadgetID(3),r2\left+1,Header_H,20,lv\bottom - lv\top,1)
          If r2\left - r1\Left > 20
            HideGadget(2,0)
            HideGadget(3,0)
          Else
            HideGadget(3,0)
          EndIf
      EndSelect
     
   
    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
          GetClientRect_(WindowID(0),w.RECT)
          MoveWindow_(GadgetID(0),10,10,w\right-w\left-20,w\bottom-w\top-60,1)
          MoveWindow_(GadgetID(4),10,w\bottom-35,80,24,1)
          MoveWindow_(GadgetID(5),100,w\bottom-35,80,24,1)
          GetClientRect_(GadgetID(1),lv.RECT)
          MoveWindow_(Header,0,GetGadgetAttribute(0,#PB_ScrollArea_Y),DesktopWidth(0),Header_H,1)
          RedrawWindow_(GadgetID(1),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)          
          
         
   EndSelect   
  ProcedureReturn result 
EndProcedure
  
If OpenWindow(0, 0, 0, 640, 340, "ListIcon Gadget",#PB_Window_Invisible| #PB_Window_SystemMenu |#PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget |#PB_Window_SizeGadget| #PB_Window_ScreenCentered)
    ScrollAreaGadget(0, 0,0,0,0,DesktopWidth(0),DesktopHeight(0),50,#PB_ScrollArea_Flat)
    SetGadgetColor(0,#PB_Gadget_BackColor,$D6FFFF)
    ListIconGadget(1,0, 0,1940, 1200, "Column 0",100,#LVS_EX_DOUBLEBUFFER|#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)    
    
    imageList = ImageList_Create_(1,24, #ILC_COLOR32, 0, 0)    
    SendMessage_(GadgetID(1), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    SetWindowLongPtr_(GadgetID(1),#GWL_EXSTYLE,0)
    
      For i = 1 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 100)
      Next
      
      For i = 0 To 500
        AddGadgetItem(1, i, "Item "+Str(i)+Chr(10)+Space(6)+"Item "+Str(i)+Chr(10)+Space(6)+"Item "+Str(i)+Chr(10)+"Item "+Str(i)+Chr(10)+"Item 7")
      Next
      
      Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
      oldproc = SetWindowLongPtr_(Header, #GWL_WNDPROC, @Hheight())
      SendMessage_(GadgetID(1), #LVM_SCROLL, 0, 0)
     
      SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
      SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    
      GetWindowRect_(Header,r.RECT)
      Header_H = r\bottom-r\top    
        
    ListIconGadget(2,101, Header_H, 20, 1200, "Column 1",20,#LVS_EX_DOUBLEBUFFER|#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER) ;Height - 20 for the hidden Hal ScrollBar    
    
    SendMessage_(GadgetID(2), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    
    SetParent_(GadgetID(2),GadgetID(1))
    SetWindowLongPtr_(GadgetID(2),#GWL_EXSTYLE,0)
    SetGadgetColor(2,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(2,#PB_Gadget_LineColor,$C5C5C5)
      For i = 0 To 500
        AddGadgetItem(2, i, " "+Chr(10)+"")
      Next
      
    ListIconGadget(3,201,  Header_H, 20, 1200, "Column 2",20,#LVS_EX_DOUBLEBUFFER| #WS_EX_TOPMOST |#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER) ;Height - 20 for the hidden Hal ScrollBar    
    
    SendMessage_(GadgetID(3), #LVM_SETIMAGELIST, #LVSIL_SMALL, imageList)
    
    SetParent_(GadgetID(3),GadgetID(1))
    SetWindowLongPtr_(GadgetID(3),#GWL_EXSTYLE,0)
    SetGadgetColor(3,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(3,#PB_Gadget_LineColor,$C5C5C5)
      For i = 0 To 500
        AddGadgetItem(3, i, ""+Chr(10)+"")
      Next
      
    ImageList_Destroy_(imageList)  
    CloseGadgetList()
    
    ButtonGadget(4,10,305,80,24,"Previous Page")
    ButtonGadget(5,100,305,80,24,"Next Page")    
    
    SetWindowCallback(@WndProc())
    HideWindow(0,0)
    
    Repeat
    ShowScrollBar_(GadgetID(1),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
    Select WaitWindowEvent()
      Case  #PB_Event_CloseWindow
        End
      Case  #PB_Event_Gadget
        Select EventGadget()
          Case 4
            Index = Index - 50
            If Index < 0
              Index = 0
            EndIf
            SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(2),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(3),#LVM_ENSUREVISIBLE,Index,1)
            
          Case 5
            Index = Index + 50
            SendMessage_(GadgetID(1),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(2),#LVM_ENSUREVISIBLE,Index,1)
            SendMessage_(GadgetID(3),#LVM_ENSUREVISIBLE,Index,1)            
            
        EndSelect
    EndSelect
  ForEver
EndIf




