Рисование изображения на элементе управления Panel дает артефакты при изменении размера

В настоящее время я пытаюсь выполнить то, что, по моему мнению, было бы простой задачей:

Нарисуйте изображение на всей области элемента управленияPanelв Windows Forms. (Пожалуйста, проигнорируйте на данный момент, что я мог бы использовать свойствоBackgroundImage)

Изображение для рисования выглядит следующим образом:

enter image description here

Т.е. желтая рамка с синей рамкой 1 пиксель вокруг.

Для рисования я использую событие Paintэлемента управления Panel:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle);
}

Это выглядит нормально при первоначальном отображении формы:

enter image description here

При изменении размера формы (и закрепленной панели тоже) она либо срезает края, когда становится меньше...

enter image description here

... или он рисует артефакты, когда его делают больше:

enter image description here

Я почти уверен, что происходит что-то довольно простое и прямолинейное, но я действительно не могу понять причину.

Поскольку я игнорирую ClipRectangleи всегда рисую все, я думал, что изображение будет масштабироваться все время.

Мои вопросы:

  • В чем причина артефактов? (Я люблюпонимать это!)
  • Что мне нужно сделать, чтобы избавиться от артефактов? (помимо вызова Invalidateпри каждом изменении размера)

Обновление, РЕШЕНИЕ:

Благодаря ответу Райана, я смог найти приемлемое решение. По сути, я вывел класс из Panel, переопределил OnPaintBackgroundи вызвал небазовый метод. Наконец, я добавил следующий код в конструктор моей производной панели:

base.DoubleBuffered = true;

SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

UpdateStyles();

7
задан Community 23 May 2017 в 10:30
поделиться