Управление ScrollBar на C# в Visual Studio

Рейтинг: 2Ответов: 1Опубликовано: 08.05.2011

Мне требуется, чтобы при изменении программно текста TextBox'а скроллбар не двигался в самый верх. Хотя бы как задать его координату програмно и возвратить текущее положение. Как работает свойство TextBox'а, AutoScrollOffset вообще не понятно.

мой TextBox представляет собой длинный список изменяющихся во времени без участия пользователя величин в виде длинной длинной вертикальной полосы. и хотелось бы передвинуть скролл например в середину списка и чтоб он там и оставался.

Ответы

▲ 3Принят

Для управления ScrollBar можно использовать API функции:

//типы ScrollBar-ов
private const int SB_HORZ = 0x0;
private const int SB_VERT = 0x1;

//WM - сообщения
private const int WM_HSCROLL = 0x114;
private const int WM_VSCROLL = 0x115;

//Комманды для ScrollBar-а
private const int SB_THUMBPOSITION = 4;

//Получении позиции
//Возвращает насколько я понял верхнюю видимую строку TextBox-а
//nBar = тип ScrollBar
[DllImport("user32.dll")]
private static extern int GetScrollPos(IntPtr hWnd, int nBar);

//Установка позиции бегунка на ScrollBar-е
//nBar = тип ScrollBar
//nPos = строка
[DllImport("user32.dll")]
private static extern int SetScrollPos(IntPtr hWnd, int nBar, int nPos, bool bRedraw);

//PostMessage, необходима для установки позиции в TextBox-е
[DllImport("user32.dll")]
private static extern bool PostMessageA(IntPtr hWnd, int nBar, int wParam, int lParam);

//Пример
private void test()
{
    //Получаем актуальную позицию ScrollBar-а TextBox-а
    int originalLine = GetScrollPos(textBox1.Handle, SB_VERT);

    //Ставим бегунок ScrollBar-a, будто верхняя видимая строка у нас восьмая
    SetScrollPos(textBox1.Handle, SB_VERT, 8, true);

    //Прокручиваем TextBox к восьмой строке
    PostMessageA(textBox1.Handle, WM_VSCROLL, SB_THUMBPOSITION + 0x10000 * 8, 0);

}

Документация: