Page 1 of 1

Scroll two ExplorerListView together

Posted: 27 Feb 2014, 13:20
by namalyaya@gmail.com
Hello :geek: , I want to Scroll two ExplorerListView with together.
Can you explain, how do that. :(

Re: Scroll two ExplorerListView together

Posted: 28 Feb 2014, 19:08
by TiKu
Hi,

Right now I don't have the time to create a sample project, but it should be easy. I'd subclass both controls and watch for WM_VSCROLL and WM_HSCROLL messages. Then I would duplicate these messages and send them to the slave control. To identify master and slave control, you could use GetCursorPos and WindowFromPoint and declare the control with the mouse cursor in it as the master control.

Hope this helps
TiKu

Re: Scroll two ExplorerListView together

Posted: 08 Mar 2014, 08:19
by namalyaya@gmail.com
Thanks :geek: Tiku Spend your time for answer :) . but I am not genius of Programming :cry: . So I haven't knowledge about sub class :? . do you can provide any similar post link which I can understand your solution. :D

Re: Scroll two ExplorerListView together

Posted: 08 Mar 2014, 10:22
by TiKu
I'll put something together tomorrow.

Re: Scroll two ExplorerListView together

Posted: 08 Mar 2014, 10:27
by namalyaya@gmail.com
Thanks TiKu again. :D

Re: Scroll two ExplorerListView together

Posted: 09 Mar 2014, 18:40
by TiKu
This seems to be more difficult than expected. The best solution I could find doesn't involve sub-classing at all. Instead it uses the AfterScroll event:

Code: Select all

Option Explicit


Private Sub Form_Load()
  Dim i As Long
  
  lv1.View = vDetails
  lv1.Columns.Add "Column 1", , 300
  For i = 1 To 100
    lv1.ListItems.Add "Item " & CStr(i)
  Next i
  lv2.View = vDetails
  lv2.Columns.Add "Column 1", , 300
  For i = 1 To 100
    lv2.ListItems.Add "Item " & CStr(i)
  Next i
End Sub

Private Sub lv1_AfterScroll(ByVal dx As Long, ByVal dy As Long)
  If lv1.Tag = "" Then
    If lv1.View = vDetails Then
      lv2.Tag = 1
      lv2.Scroll dx, dy * (lv2.ItemHeight + 2)
      lv2.Tag = ""
    End If
  End If
End Sub

Private Sub lv2_AfterScroll(ByVal dx As Long, ByVal dy As Long)
  If lv2.Tag = "" Then
    If lv2.View = vDetails Then
      lv1.Tag = 1
      lv1.Scroll dx, dy * (lv1.ItemHeight + 2)
      lv1.Tag = ""
    End If
  End If
End Sub
The problem with this approach is, that it doesn't synchronize all scroll events. For instance it won't catch the scrolling that is involved when selecting items by keyboard (arrow keys etc.)

Regards
TiKu