Синхронизированная прокрутка для двух Richtextbox (C#)

Мне нужна помощь. В настоящее время я работаю над редактором сценариев в C#, и у меня есть два многофункциональных текстовых поля: programTextBox, где весь текст, и linesTextBox, который считает и показывает количество строк.

Я хочу, чтобы они прокручивали одновременно. Я сделал некоторый поиск, и я действительно нашел некоторый код, который работает, но если есть несколько проблем. Вот код:

public enum ScrollBarType : uint
{
    SbHorz = 0,
    SbVert = 1,
    SbCtl = 2,
    SbBoth = 3
}
public enum Message : uint
{
    WM_VSCROLL = 0x0115
}
public enum ScrollBarCommands : uint
{
    SB_THUMBPOSITION = 4
}
[DllImport("User32.dll")]
public extern static int GetScrollPos(IntPtr hWnd, int nBar);
[DllImport("User32.dll")]
public extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);

...

private void programTextBox_VScroll(object sender, EventArgs e)
{
    int nPos = GetScrollPos(programTextBox.Handle, (int)ScrollBarType.SbVert);
    nPos <<= 16;
    uint wParam = (uint)ScrollBarCommands.SB_THUMBPOSITION | (uint)nPos;
    SendMessage(linesTextBox.Handle, (int)Message.WM_VSCROLL, new IntPtr(wParam), new IntPtr(0));
}

Оно работает. Вид. И вы можете спросить: "В чем проблема?". Что ж:

1) Моя программа падает, когда общее количество строк становится около 2500. Я получаю ошибку переполнения.

2) Если я перемещаюсь вверх и вниз с помощью полосы прокрутки вместо колесика мыши, то мое второе поле расширенного текста (linesTextBox) не будет следовать за первым, если я не отпущу полосу прокрутки.

1 ответ

Если приложение прокручивает содержимое окна, оно также должно сбросить положение поля прокрутки с помощью функции SetScrollPos. Посмотрите на это: https://msdn.microsoft.com/en-in/library/aa926329.aspx

Кроме того, сообщение WM_VSCROLL содержит только 16 бит данных о положении поля прокрутки, это может быть причиной, по которой вам следует попробовать GetScrollInfo, так как оно имеет 32 бита данных pos поля прокрутки. Это может дать решение обеих ваших проблем. Надеюсь это поможет...

Другие вопросы по тегам