C# 두개의 listview를 동시에 스크롤 하는 방법

안녕하세요.

C# WinForms에서 두개의 listview를 동시에 가로스크롤하는 기능을 구현하고자 합니다.

이런저런 방법을 다 써봤는데, 잘 안되네요.

Google을 아무리 뒤져도 그런 방법이 보이지 않습니다.

혹시 하실 수 있으신 분께 가르침 부탁드립니다.

1 Like

WinForms인지 WPF인지 알려주셔야 답변이 가능할 것 같네요.

2 Likes

안녕하세요. WinForms입니다. 가르침을 하사하여 주십시오.

GetScrollPos API로 스크롤의 위치를 가져오고,
SendMessage API를 통해 스크롤을 위치를 조정하면 됩니다.

    public sealed class ScrollMessageFilter : IMessageFilter
    {
        [DllImport("user32.dll")]
        private static extern int GetScrollPos(IntPtr hWnd, int nBar);

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);
        
        private const int WM_VSCROLL = 0x0115;
        private const int SB_THUMBPOSITION = 4;

        public ScrollMessageFilter(ListBox source, ListBox dest)
            => (Source, Dest) = (source, dest);

        public ListBox Source { get; }

        public ListBox Dest { get; }

        public bool PreFilterMessage(ref Message m)
        {
            if (m.HWnd == Source.Handle)
            {
                SynchronizeListBoxScroll();
            }
            return false;
        }

        public void SynchronizeListBoxScroll()
        {
            int pos = GetScrollPos(Source.Handle, 1);
            int wParam = SB_THUMBPOSITION | (pos << 16);
            SendMessage(Dest.Handle, WM_VSCROLL, wParam, 0);
        }
    }

사용법은 알아서…

2 Likes