Code: Select all
#CDDS_ITEMPREPAINT = #CDDS_ITEM|#CDDS_PREPAINT 
#CDDS_SUBITEMPREPAINT = #CDDS_SUBITEM|#CDDS_ITEMPREPAINT 
Global header_1,header_2,oldCallback,Row_H ,Header_H,dY
Global w.RECT,rc.RECT,lv.RECT
Procedure LIcallback(hwnd, msg, wparam, lparam)
If IsGadget(3)
    ShowScrollBar_(GadgetID(2),#SB_BOTH,0)
    ShowScrollBar_(GadgetID(3),#SB_BOTH,0)
EndIf
result = CallWindowProc_(oldCallback, hwnd, msg, wparam, lparam)
;   
  Select msg
    Case #WM_VSCROLL,#WM_MOUSEWHEEL
        SelItem = GetScrollPos_(GadgetID(1),#SB_VERT) - GetScrollPos_(GadgetID(2),#SB_VERT)
        SendMessage_(GadgetID(2), #LVM_SCROLL, 0, SelItem * Row_H)
        SendMessage_(GadgetID(3), #LVM_SCROLL, 0, SelItem * Row_H)
        RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
    Case #WM_HSCROLL
        rc.RECT\top = 1
        rc.RECT\left = #LVIR_BOUNDS
        SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
        MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
        MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
        RedrawWindow_(WindowID(0),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
        
    Case #WM_KEYDOWN,#WM_MENUSELECT
;           SendMessage_(hwnd, #LVM_GETTOPINDEX, 0, 0)
;           If wParam=#VK_NEXT                       
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEDOWN,0)
;           ElseIf wParam=#VK_PRIOR
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_PAGEUP,0)
;           ElseIf wParam=#VK_UP
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEUP,0)
;           ElseIf wParam=#VK_DOWN
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_LINEDOWN,0)
;           ElseIf wParam=#VK_HOME
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_TOP,0)
;           ElseIf wParam=#VK_END
;             SendMessage_(GadgetID(1),#WM_VSCROLL,#SB_BOTTOM,0)
;           ElseIf wParam=#VK_LEFT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINELEFT,0)
;           ElseIf wParam=#VK_RIGHT
;             SendMessage_(GadgetID(1),#WM_HSCROLL,#SB_LINERIGHT,0)
;           EndIf
    EndSelect
ProcedureReturn result
EndProcedure
; 
Procedure WndProc(hwnd, uMsg, wParam, lParam)
GetClientRect_(WindowID(0),w.RECT)
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 
                  Col = *LVCDHeader\iSubItem 
                  If (Row/2) * 2 = Row 
                    *LVCDHeader\clrTextBk = $D6FFFF 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  Else 
                    *LVCDHeader\clrTextBk = $CEF6F5 
                    If Col = 2 
                      *LVCDHeader\clrText = $FF0000 
                    EndIf 
                  EndIf            
                      result = #CDRF_NEWFONT 
            EndSelect 
      EndSelect     
      *nmHEADER.HD_NOTIFY = lParam               
      Select *nmHEADER\hdr\code 
        Case #HDN_ITEMCHANGING,#HDN_ITEMCHANGED
          If *nmHEADER\hdr\hwndFrom = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
            MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
            rc.RECT\top = 1
            rc.RECT\left = #LVIR_BOUNDS
            SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
            MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
            MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
            RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
            RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)             
            
          EndIf
      EndSelect
    Case #WM_SIZE,#WM_MOVE,#WM_PAINT
         MoveWindow_(GadgetID(1),10,10,w\right-w\left-20,w\bottom-w\top-40,1)
         rc.RECT\top = 1
         rc.RECT\left = #LVIR_BOUNDS
         SendMessage_(GadgetID(1), #LVM_GETSUBITEMRECT, 1, rc)
         GetClientRect_(GadgetID(1),lv.RECT)
         MoveWindow_(GadgetID(2),rc\left+1,Header_H,Row_H,lv\bottom-dY,1)
         MoveWindow_(GadgetID(3),rc\right+1,Header_H,Row_H,lv\bottom-dY,1)
         RedrawWindow_(GadgetID(2),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
         RedrawWindow_(GadgetID(3),#Null,#Null,#RDW_INVALIDATE|#RDW_UPDATENOW)
   EndSelect   
  ProcedureReturn result 
EndProcedure
  
  
  If OpenWindow(0, 0, 0, 640, 300, "ListIconGadgets", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget| #PB_Window_MaximizeGadget|#PB_Window_SizeGadget |#PB_Window_ScreenCentered)
    ListIconGadget(1,10, 10,620, 266, "Column 0",150,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes)
    Header = SendMessage_(GadgetID(1), #LVM_GETHEADER, 0, 0)
    AddGadgetColumn(1, 1, "Column 1",150)
    AddGadgetColumn(1, 2, "Column 2",150)
      For i = 3 To 6
        AddGadgetColumn(1, i, "Column " + Str(i), 65)
      Next
      For i = 0 To 30
        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
    SetGadgetColor(1,#PB_Gadget_BackColor,$EAFEFE)
    SetGadgetColor(1,#PB_Gadget_LineColor,$C5C5C5)
    
    Row_H = SendMessage_(GadgetID(1), #LVM_GETITEMSPACING, #True, 0) >> 16 + 2
    GetWindowRect_(Header,r.RECT)
    Header_H = r\bottom-r\top
    
    If OSVersion() > #PB_OS_Windows_Server_2003
      dY = 7
    Else
      dY = 2
    EndIf
        
    ListIconGadget(2,151,  Header_H, Row_H, 266, "Column 1",Row_H,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 30
        AddGadgetItem(2, i, ""+Chr(10)+"")
      Next
      
    ListIconGadget(3,301,  Header_H, Row_H, 266, "Column 2",Row_H,#PB_ListIcon_GridLines|#PB_ListIcon_CheckBoxes|#LVS_NOCOLUMNHEADER)    ;Height - 20 for the hidden Hal ScrollBar    
    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 30
        AddGadgetItem(3, i, ""+Chr(10)+"")
      Next
      
    oldCallback = SetWindowLongPtr_(GadgetID(1), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(2), #GWL_WNDPROC, @LIcallback())
    oldCallback = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @LIcallback())
   
    SetWindowCallback(@WndProc())
    SetActiveGadget(1)
Repeat
      Select WaitWindowEvent()
      
        Case #PB_Event_CloseWindow
            Q = 1
       
        Case #WM_CLOSE     
      
        Case #PB_Event_Gadget
          Select EventGadget()
           Case 1            
          EndSelect
    
EndSelect
    Until Q = 1
  EndIf