2011-02-07 197 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個字符。

沒有嘗試過......但是可能工作