Как заставить WinForms RichTextBox правильно рисовать линии, не выделяя их?

#c# #winforms

Вопрос:

У меня есть System.Windows.Forms.RichTextBox консоль, в которую я добавляю большое количество строк за короткий промежуток времени, возможно, несколько сотен как можно быстрее. Видны только первая и последняя строки в области текстового поля, а остальные окрашены в белый цвет до тех пор, пока они не будут выделены или прокручены и обратно.

перед выделением

после выделения

Я пытался использовать this.console.Invalidate(); для принудительной перекраски и следующий код для приостановки рисования до и после, чтобы смягчить эту проблему, но она по-прежнему присутствует.

 [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] static extern IntPtr SendMessage(HandleRef hWnd, Int32 Msg, IntPtr wParam, IntPtr lParam);  const int WM_SETREDRAW = 0x000B; HandleRef console = new HandleRef(this.console, this.console.Handle);  SendMessage(console, WM_SETREDRAW, IntPtr.Zero, IntPtr.Zero); /// print many lines SendMessage(console, WM_SETREDRAW, new IntPtr(1), IntPtr.Zero);  

Является ли это ошибочным поведением или мой код каким-то образом неверен?

Комментарии:

1. Я не думаю, что RTB нравится рисунок владельца, так же как и текстовому окну.

2. Я действительно не знаю, что это значит, как я сделал «рисунок владельца»? Я добавил эти дополнительные элементы управления краской только из-за ошибки рендеринга, до этого все, что я делал, было AppendText в цикле, и у него были точно такие же проблемы с рендерингом.

3. Да, любой код в событии Paint, по крайней мере, в какой-то степени является «рисунком владельца». Боюсь, что устаревшие элементы управления недостаточно хорошо подходят для этого, что еще один способ назвать это ошибкой 🙂

4. Это не имеет никакого отношения к ownerdraw. Очень любопытно, что в RTB нет встроенной функции, но я предложил это решение много лет назад и никогда не слышал жалоб. Будучи вынужденным догадываться, я бы сказал, что вы делаете это из рабочего потока.

5. Нет, это единственный поток в программе, предназначенный для самой формы. Я просто изучаю правила и решил ввести имена и идентификаторы процессов всех процессов в моей системе, чтобы придать ей что-то недетерминированное, и это было поведение, когда я добавил все AppendText это в цикл.