Отключение автопрокрутки RichTextBox - PullRequest
5 голосов
/ 07 февраля 2011

Я использую элемент управления RichTextBox для отображения журналов приложений. Я обновляю элемент управления раз в секунду несколькими вызовами метода RichTextBox :: AppendText. Что меня действительно раздражает, так это то, что курсор продолжает прокручиваться до последней строки текста. Это очень неудобно в ситуации, когда пользователю нужно анализировать журналы, которые находятся в начале. Я пробовал следующее решение моей проблемы:

int pos = tb_logs.SelectionStart;
tb_logs.AppendText("log message");
tb_logs.SelectionStart = pos;

Это не идет к сути проблемы, потому что контроль периодически перерисовывается, что очень отвлекает. Есть ли какое-нибудь более чистое решение?

Ответы [ 2 ]

7 голосов
/ 07 февраля 2011

Если ваша проблема связана с прокруткой вниз по вертикали при добавлении текста журнала, но вы бы хотели, чтобы он постоянно находился сверху:

Вы должны добавить обработчики событий в события VScroll, TextChanged и в обработчике событий установить прокрутку наверх

richTextBox1.VScroll += HandleRichTextBoxAdjustScroll;
richTextBox1.TextChanged += HandleRichTextBoxAdjustScroll;

private const UInt32 SB_TOP = 0x6;
private const UInt32 WM_VSCROLL = 0x115;

[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", SetLastError = true)]
private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg,
    IntPtr wParam, IntPtr lParam);

private void HandleRichTextBoxAdjustScroll(Object sender,
    EventArgs e)
{
    PostMessage(handle, WM_VSCROLL, (IntPtr)SB_TOP, IntPtr.Zero);
}

Вы можете сделать то же самое с горизонтальной полосой прокрутки тоже. Замените WM_VSCROLL на WM_HSCROLL и SB_TOP на SB_LEFT

private const UInt32 WM_HSCROLL = 0x0114;
private const UInt32 SB_LEFT = 0x06;
0 голосов
/ 07 февраля 2011

Вы можете попробовать tb_logs.SelectionLength = 1; вместе с SelectionStart. Это сделает 1 символ выбранным из вашей текущей позиции.

Не пробовал ... Но может сработать

...