MFC 两个listbox滚动条同步

同上,如何使MFC 两个listbox滚动条同步?
同上,如何使MFC 两个listbox滚动条同步?
同上,如何使MFC 两个listbox滚动条同步?

如果两个listbox的长度相同,最简单的办法是subclass第一个滚动条的wm_scroll消息,然后再SendMessage发到第二个。(两个滚动条的长度不同,那么这个办法不行,就需要判断滚动位置,然后按比例滚动另一个了)


WNDPROC g_pOldWndProc;

HWND hlist2;

LRESULT MyOwnWinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    if (msg == WM_VSCROLL)
       SendMessage(hlist2, msg, wParam, lParam);
    return g_pOldWndProc(hWnd, msg, wParam, lParam);
}

void CQ698911Dlg::OnBnClickedButton1()
{
    // TODO: Add your control notification handler code here
    wchar_t num[10];
    for (int i = 0; i < 100; i++)
    {
        memset(num, 0, 10 * sizeof(wchar_t));
        _itow(i, num, 10);
        m_list1.InsertString(i, (LPCTSTR)num);
        m_list2.InsertString(i, (LPCTSTR)num);
    }
    g_pOldWndProc = (WNDPROC)SetWindowLongPtr(m_list1.m_hWnd, GWLP_WNDPROC, (LONG_PTR)MyOwnWinProc);
    hlist2 = m_list2.m_hWnd;
}


void CQ698911Dlg::OnClose()
{
    // TODO: Add your message handler code here and/or call default
    SetWindowLongPtr(m_list1.m_hWnd, GWLP_WNDPROC, (LONG_PTR)g_pOldWndProc);
    CDialogEx::OnClose();
}

图片说明