Sun
23
Nov 2008
Kiedy piszemy konsolę w postaci zwykłego systemowego okienka z kontrolką RichEdit, powstaje pytanie, czy podczas dodawania nowego komunikatu przewijać ją na dół. Jeśli nie, to będzie denerwujące dla użytkownika, który chciałby stale widzieć najnowsze komunikaty. Jeśli tak, to będzie denerwujące dla tego, kto chciałby przeczytać konkretny komunikat mimo pojawiania się nowych. Co więc zrobić? Przycisk, który pozwoli zablokować przewijanie konsoli?
Moim zdaniem najlepiej jest zrobić tak, jak to robi Visual C++ choćby w okienku Output - przewijać, jeśli kursor jest na końcu i nie przewijać, jeśli użytkownik umieści go gdzieś wyżej. W C# z kontrolką typu RichTextBox można to zrobić tak:
public void OutputLine(string Text, Color c) { int SelectionStart = RichTextBox1.SelectionStart; bool SelectionAtEnd = (SelectionStart == RichTextBox1.Text.Length) && (RichTextBox1.SelectionLength == 0); RichTextBox1.SelectionStart = RichTextBox1.Text.Length; RichTextBox1.SelectionLength = 0; RichTextBox1.SelectionColor = c; RichTextBox1.AppendText(Text + "\r\n"); if (SelectionAtEnd) RichTextBox1.ScrollToCaret(); else RichTextBox1.SelectionStart = SelectionStart; }