В настоящее время я пытаюсь сделать то, что я думал, было бы простой задачей:
Нарисуйте изображение на всю область Panel
элемента управления в Windows Forms.(На данный момент не обращайте внимания на то, что я могу использовать свойство BackgroundImage
)
Изображение для рисования выглядит следующим образом:
Т.е. желтая рамка с синей рамкой в 1 пиксель вокруг.
Для рисования я использую событие Paint
элемента управления Panel
:
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle);
}
Это выглядит отличнопри первоначальном отображении формы:
При изменении размера формы (и закрепленной панели тоже) она либо обрезает края, когда становится меньше ...
... или рисует артефакты, когда их увеличивают:
Я почти уверен, что что-то происходитдовольно просто и прямо, но я действительно не могу понять причину.
Так как я игнорирую 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();