Winforms Двойная буферизация - PullRequest
28 голосов
/ 15 сентября 2010

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

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

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

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

1 Ответ

57 голосов
/ 15 сентября 2010

Это влияет только на саму форму, а не на дочерние элементы управления.Если у вас их много, то время, которое им нужно по очереди рисовать самим, становится заметным, оно оставляет прямоугольное отверстие, куда идет элемент управления, который не заполняется, пока дочерний элемент управления не получит свой ход.Для борьбы с этим вам потребуется двойная буферизация всей формы и элементов управления.Эта опция доступна начиная с 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 разумным в отношении того, на какой «элемент управления» нажал пользователь.

...