#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
это в цикл.