Ответ 1
Нашел проблему!!! Проблема связана с свойством Anchor текстового поля. Как только я удалил его, восстановление окна было незамедлительным. BTW, новый пользовательский класс не требуется
Я создал форму в С# (VS2010), которая содержит (среди прочего) элемент управления текстовым полем. Текстовое поле может содержать большое количество данных в некоторой точке (~ 3 миллиона символов).
При прокрутке или перемещении формы вокруг проблем не возникает, но когда форма сведена к минимуму и восстанавливается снова, запускается последовательность перерисовки (я считаю), которая вызывает большую задержку в 5-10 секунд для формы перекрасить.
Я уже пробовал несколько решений:
Использование двойного буфера - в соответствии с тем, что я прочитал, двойная буферизация применяется только к самой форме, а не к ее элементам управления
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
Отключение разворачивания текстового поля после его минимизации с помощью: SendMessage(this.my_textBox.Handle, WM_SETREDRAW, false, 0);
и возврат назад после восстановления формы. Я заметил, что отставание формы repaint существует и в том случае, если я не повторно активировал перерисовку текстового поля.
Ручной двойной буфер с использованием растрового изображения - аналогичные результаты, как # 1.
Я где-то читал, что эта проблема может быть связана с элементом управления текстовым полем, пытающимся сжимать или корректировать объем данных, но не может его переопределить.
Ранее у меня был тот же проект в MFC, но он не встречал никаких проблем с перерисовкой или отставанием.
Пожалуйста, сообщите мне, как решить эту проблему.
Нашел проблему!!! Проблема связана с свойством Anchor текстового поля. Как только я удалил его, восстановление окна было незамедлительным. BTW, новый пользовательский класс не требуется
Возможно, я что-то не понимаю (или, может быть, есть причина, по которой вы не можете этого сделать), но не можете ли вы просто получить свой собственный класс TextBox?
public class MyTextBox : TextBox
{
public MyTextBox() : base()
{
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, false);
}
}
А затем используйте его вместо обычного текстового поля?