web-dev-qa-db-ja.com

新しいデータが書き込まれると、リッチテキストボックスが下にスクロールします

私のプログラムはJavaを呼び出してから、stdoutをRichTextBoxにリダイレクトします。私の問題は、データが書き込まれるたびに垂直スクロールバーが常にボックスの上部に留まることです。

一番下までスクロールしても、新しいデータが書き込まれると一番上に移動します。私は反対をお願いします。

そのため、新しいデータが書き込まれると、一番下にとどまります。これどうやってするの?

66
user1158745

はい、 ScrollToCaret() メソッドを使用できます:

// bind this method to its TextChanged event handler:
// richTextBox.TextChanged += richTextBox_TextChanged;
private void richTextBox_TextChanged(object sender, EventArgs e) {
   // set the current caret position to the end
   richTextBox.SelectionStart = richTextBox.Text.Length;
   // scroll it automatically
   richTextBox.ScrollToCaret();
}
133
Omar

RichTextBoxにフォーカスがある場合、AppendTextを使用して情報を追加すると、RichTextBoxは最後までスクロールされたままになります。 HideSelectionをFalseに設定すると、フォーカスを失ったときに選択を保持し、自動スクロールのままになります。

以下の方法を使用するログビューアーGUIを設計しました。それは完全なコアまで追いついていました。このコードを削除してHideSelectionをFalseに設定すると、CPU使用率が1〜2%になりました

//Don't use this!
richTextBox.AppendText(text);  
richTextBox.ScrollToEnd();
14
DrWu
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    private static extern IntPtr SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
    private const int WM_VSCROLL = 277;
    private const int SB_PAGEBOTTOM = 7;

    internal static void ScrollToBottom(RichTextBox richTextBox)
    {
        SendMessage(richTextBox.Handle, WM_VSCROLL, (IntPtr)SB_PAGEBOTTOM, IntPtr.Zero);
        richTextBox.SelectionStart = richTextBox.Text.Length;
    }

ScrollToBottom(richTextBox);

上記の方法を使用すると、リッチテキストボックスを下にスクロールできます

6

シンプルにしておきます。

  • HideSelectionプロパティをfalseに設定します

  • AppendText()メソッドを使用して、テキストをRichTextBoxに追加します。

コード:

RichTextBox rtbTest;

void InitRichTextBox()
{
    //Init rtbTest...

    rtbTest.HideSelection = false;//Hide selection so that AppendText will auto scroll to the end
}

void AddText(string txt)
{
    rtbTest.AppendText(txt);
}
3
123iamking