Подтвердить что ты не робот

Двойная буферизация Winforms

Я добавил это в код конструктора формы:

this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);

Но он по-прежнему показывает уродливые артефакты, когда он загружает элементы управления, когда они меняются (часто изменяются форма и его компоненты (требуется обновление)).

Что мне нужно сделать по-другому?

4b9b3361

Ответ 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 умным, о том, что пользователь "нажал".

Ответ 2

Это прекрасно работает! Даже на Windows 10. Но в тот момент, когда я минимизирую свой графический интерфейс и снова его поднимаю, он снова начинает мерцать. Есть идеи почему? И как это исправить?