Mon programme appelle Java, puis redirige stdout vers un RichTextBox
. Mon problème est que la barre de défilement verticale reste toujours en haut de la boîte à chaque fois que des données sont écrites.
Même si vous faites défiler l'écran vers le bas, une fois que de nouvelles données ont été écrites, elles iront au sommet. Je voudrais le contraire.
Ainsi, lorsque de nouvelles données sont écrites, elles restent en bas. Comment puis-je faire ceci?
Oui, vous pouvez utiliser la méthode 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();
}
La RichTextBox continuera à défiler jusqu'à la fin si elle a le focus et que vous utilisez AppendText pour ajouter les informations. Si vous définissez HideSelection sur False, il conservera sa sélection lorsqu'il perd le focus et restera en défilement automatique.
J'ai conçu une interface graphique Log Viewer utilisant la méthode ci-dessous. Il a utilisé jusqu'à un noyau complet de suivre. La suppression de ce code et la définition de HideSelection sur False ont réduit l’utilisation de la 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);
en utilisant la méthode ci-dessus, vous pouvez faire défiler la zone de texte riche vers le bas
Je vais rester simple:
Définissez la propriété HideSelection
sur false
Utilisez la méthode AppendText()
pour ajouter du texte à RichTextBox.
Code:
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);
}