私のプログラムはJavaを呼び出してから、stdoutをRichTextBox
にリダイレクトします。私の問題は、データが書き込まれるたびに垂直スクロールバーが常にボックスの上部に留まることです。
一番下までスクロールしても、新しいデータが書き込まれると一番上に移動します。私は反対をお願いします。
そのため、新しいデータが書き込まれると、一番下にとどまります。これどうやってするの?
はい、 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();
}
RichTextBoxにフォーカスがある場合、AppendTextを使用して情報を追加すると、RichTextBoxは最後までスクロールされたままになります。 HideSelectionをFalseに設定すると、フォーカスを失ったときに選択を保持し、自動スクロールのままになります。
以下の方法を使用するログビューアーGUIを設計しました。それは完全なコアまで追いついていました。このコードを削除してHideSelectionをFalseに設定すると、CPU使用率が1〜2%になりました
//Don't use this!
richTextBox.AppendText(text);
richTextBox.ScrollToEnd();
[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);
上記の方法を使用すると、リッチテキストボックスを下にスクロールできます
シンプルにしておきます。
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);
}