With 2 ListViewGadget:
Code: Select all
Procedure MouseOverGadget(window,gadget)
If (WindowMouseX(window) >= GadgetX(gadget)) And (WindowMouseX(window) <= (GadgetX(gadget)+GadgetWidth(gadget)))
If (WindowMouseY(window) >= GadgetY(gadget)) And (WindowMouseY(window) <= (GadgetY(gadget)+GadgetHeight(gadget)))
ProcedureReturn #True
EndIf
EndIf
EndProcedure
Procedure Syncro(hWnd,msg,wParam,lParam)
Static activeGadgetID=0
gadget = GetWindowLongPtr_(hWnd,#GWL_ID)
If msg = #WM_VSCROLL
If gadget = 0 Or gadget = 1 ; both ListView
If MouseOverGadget(0,gadget)
activeGadgetID=hWnd
EndIf
If activeGadgetID=hWnd
If gadget = 0 : target = 1
Else : target = 0
EndIf
;pos = GetScrollPos_(hWnd,#SB_VERT)
;SetScrollPos_(GadgetID(target),#SB_VERT,pos,1)
top = SendMessage_( hWnd ,#LB_GETTOPINDEX ,0,0)
SendMessage_(GadgetID(target),#LB_SETTOPINDEX,top,0)
EndIf
EndIf
EndIf
proc = GetGadgetData(gadget)
If proc
ProcedureReturn CallWindowProc_(proc,hWnd,msg,wParam,lParam)
EndIf
EndProcedure
Procedure SubClassGadget(gadget,*proc)
SetGadgetData(gadget,SetWindowLongPtr_(GadgetID(gadget),#GWL_WNDPROC,*proc))
EndProcedure
If OpenWindow(0, 0, 0, 480, 300, "Sychronised Swimming", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 225, 280)
ListViewGadget(1, 245,10, 225, 280)
SubClassGadget(0,@Syncro())
SubClassGadget(1,@Syncro())
For a = 1 To 100
AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview 1")
AddGadgetItem (1, -1, "Item " + Str(a) + " of the Listview 2")
Next
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
1 ListViewGadget and 1 ListIconGadget, synchronized Top Index:
Code: Select all
Procedure MouseOverGadget(window,gadget)
If (WindowMouseX(window) >= GadgetX(gadget)) And (WindowMouseX(window) <= (GadgetX(gadget)+GadgetWidth(gadget)))
If (WindowMouseY(window) >= GadgetY(gadget)) And (WindowMouseY(window) <= (GadgetY(gadget)+GadgetHeight(gadget)))
ProcedureReturn #True
EndIf
EndIf
EndProcedure
Procedure Syncro(hWnd,msg,wParam,lParam)
Static activeGadgetID=0
gadget = GetWindowLongPtr_(hWnd,#GWL_ID)
If msg = #WM_VSCROLL
If gadget = 0 ; ListView
If MouseOverGadget(0,0)
activeGadgetID=hWnd
EndIf
If activeGadgetID=hWnd
top = SendMessage_( hWnd ,#LB_GETTOPINDEX ,0,0)
top2 = SendMessage_(GadgetID(1),#LVM_GETTOPINDEX,0,0)
SendMessage_(GadgetID(1),#LVM_GETITEMPOSITION,top2,origin.POINT) ; get pos of top item
SendMessage_(GadgetID(1),#LVM_GETITEMPOSITION,top,item.POINT) ; get pos of item we want at top
SendMessage_(GadgetID(1),#LVM_SCROLL,0,item\y - origin\y) ; scroll difference
EndIf
ElseIf gadget = 1 ; ListIcon
If MouseOverGadget(0,1)
activeGadgetID=hWnd
EndIf
If activeGadgetID=hWnd
top = SendMessage_(hWnd,#LVM_GETTOPINDEX,0,0)
SendMessage_(GadgetID(0),#LB_SETTOPINDEX,top,0)
EndIf
EndIf
EndIf
proc = GetGadgetData(gadget)
If proc
ProcedureReturn CallWindowProc_(proc,hWnd,msg,wParam,lParam)
EndIf
EndProcedure
Procedure SubClassGadget(gadget,*proc)
SetGadgetData(gadget,SetWindowLongPtr_(GadgetID(gadget),#GWL_WNDPROC,*proc))
EndProcedure
If OpenWindow(0, 0, 0, 480, 300, "Sychronised Swimming", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListViewGadget(0, 10, 10, 225, 280)
ListIconGadget(1, 245,10, 225, 280,"Column 1",100)
AddGadgetColumn(1,2,"Column 2",100)
SubClassGadget(0,@Syncro())
SubClassGadget(1,@Syncro())
For a = 1 To 100
AddGadgetItem (0, -1, "Item " + Str(a) + " of the Listview")
AddGadgetItem (1, -1, "Item " + Str(a) + Chr(10)+" of the ListIcon")
Next
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf