суббота, 8 августа 2009 г.

Автопрокрутка многострочного Textbox из .NET Framework

Понадобилось сегодня сделать автопрокрутку лога приложения, нашёл для себя два способа реализовать задуманное.
Первый и, пожалуй, самый простой способ:
Устанавливать, например в обработчике события TextChanged, позицию начала выделения текста равной длине текста в textbox'е и, затем, перематывать scrollbar textbox'а до текущей позиции каретки.
private void tbLog_TextChanged(object sender, EventArgs e)
{
this.tbLog.SelectionStart = this.tbLog.TextLength;
this.tbLog.ScrollToCaret();
}

Однако, у этого способа есть один недостаток: при такой перемотке scrollbar'а перемещается каретка ввода текста, что не всегда бывает приемлемо.

Второй способ немного интереснее и лишён вышеописанного недостатка, хотя и немного сложнее:
Посылать textbox'у, например всё в томже обработчике события TextChanged, сообщение WM_VSCROLL.
private const int WM_VSCROLL = 0x115;
private const int SB_BOTTOM = 7;

[DllImport("user32.dll", CharSet=CharSet.Auto)]
private static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);

private void tbLog_TextChanged(object sender, EventArgs e)
{
SendMessage(this.tbLog.Handle, WM_VSCROLL, (IntPtr) SB_BOTTOM, IntPtr.Zero);
}

1 комментарий:

  1. Маладца!... Всё работает :)
    Только еще пришлось добавить:

    using System.Runtime.InteropServices;

    ОтветитьУдалить