2011-02-07 116 views
5

我正在使用RichTextBox控件显示应用程序日志。我正在用一些RichTextBox :: AppendText方法调用控件,每秒更新一次。真正烦人的是光标保持滚动到文本的最后一行。当用户需要分析开始的日志时,这种情况非常不舒服。我曾尝试以下解决我的问题:禁用RichTextBox自动滚动

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

这不走的问题核心,因为控制被周期性redrawed这是非常分散。有没有更清洁的解决方案?

+0

这听起来有些奇怪,因为去年底应明确的地方进行。你确定追加的代码不会将选择设置到最后? –

+0

不,只是AppendText(“text”),AppendText(“\ t”),Appendtext(“\ n”) – truthseeker

+0

我发现有趣的事情。自动滚动仅在文本区域具有焦点时发生。点击进入文本区域后,出现问题。如果我没有点击它,我可以在滚动条上滚动消息,同时添加新消息并且文本不会跳跃。 – truthseeker

回答

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_HSCROLL和SB_TOP与SB_LEFT更换WM_VSCROLL

private const UInt32 WM_HSCROLL = 0x0114; 
private const UInt32 SB_LEFT = 0x06; 
0

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

没有尝试过......但是可能工作