Рисование изображения на элементе управления Panel дает артефакты при изменении размера - PullRequest
7 голосов
/ 17 марта 2012

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

Нарисуйте изображение на всю область 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 и not вызвал базовый метод.Наконец, я добавил следующий код в конструктор моей производной панели:

base.DoubleBuffered = true;

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

UpdateStyles();

1 Ответ

5 голосов
/ 17 марта 2012

Причина артефактов в том, что вся поверхность не перерисовывается при изменении размера формы;только необходимые запчасти есть.Как правило, лучшим решением является то, что вы не хотите делать, вызывая Invalidate при каждом изменении размера.Однако, если это действительно ваша ситуация, просто используйте вместо нее PictureBox.Если это не так, вы можете вместо этого переопределить OnPaint в своей форме и использовать this.SetStyle(ControlStyles.ResizeRedraw, true) для этого автоматически.

...