禁用RichTextBox自动滚动

时间:2011-02-07 10:02:49

标签: c# richtextbox refresh autoscroll

我正在使用RichTextBox控件来显示应用程序日志。我通过几次调用RichTextBox :: AppendText方法每秒更新一次控制。对我来说真正烦人的是光标一直滚动到文本的最后一行。当用户需要分析开头的日志时,它非常不舒服。我尝试过解决问题的方法:

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

这不是问题的核心,因为定期重新绘制控件,这非常令人分心。有一些更清洁的解决方案吗?

2 个答案:

答案 0 :(得分:7)

如果您在添加日志文本时向下滚动“垂直滚动”问题,但您希望它始终处于最佳状态:

您必须向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;

答案 1 :(得分:0)

您可以尝试tb_logs.SelectionLength = 1;和SelectionStart一起。这将从您的当前位置中选择1个字符。

没有尝试过......但可能有效