Winforms Двойная буферизация
Я добавил это в код конструктора моей формы:
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
Но он по-прежнему показывает некрасивые артефакты при загрузке элементов управления, когда они меняются (форма и ее компоненты часто изменяются (нуждаются в обновлении)).
Что мне нужно сделать по-другому?
1 ответ
Это влияет только на саму форму, а не на дочерние элементы управления. Если у вас их много, то время, которое им нужно по очереди рисовать самим, становится заметным, оно оставляет прямоугольное отверстие, куда идет элемент управления, который не заполняется до тех пор, пока дочерний элемент управления не получит свой ход.
Для борьбы с этим вам потребуется двойная буферизация всей формы и элементов управления. Эта опция доступна начиная с Windows XP, которая сделала доступным флаг стиля WS_EX_COMPOSITED. Вставьте это в вашу форму, чтобы включить:
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED
return cp;
}
}
Это совсем не ускоряет рисование, но форма задерживается на экране после задержки. Устранение видимых артефактов краски. Чтобы исправить задержку, не нужно использовать элементы управления. Что бы вы сделали, используя метод OnPaint, чтобы нарисовать "элементы управления" и сделать событие OnMouseClick умным о том, что "элемент управления" нажал пользователь.