目前我正在尝试做我认为简单的任务:
在Windows窗体中将图像绘制到Panel
control 的完整区域。 (请暂时忽略我可以使用BackgroundImage
property)
要绘制的图像如下所示:
即。一个黄色的盒子,周围有一个1像素的蓝框。
要绘制,我正在使用Paint
控件的Panel
事件:
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle);
}
最初显示表单时看起来很好:
当调整窗体大小(以及停靠的面板)时,它会在缩小时缩小边缘...
......或者当它变得更大时它会绘制人工制品:
我很确定会发生一些相当简单和直接的事情,但我真的无法理解其中的原因。
由于我忽略了ClipRectangle
并且总是绘制所有内容,我认为图像会一直缩放。
我的问题是:
Invalidate
旁边)更新,解决方案:
感谢Ryan's answer,我找到了一个可以接受的解决方案。基本上我从Panel
派生了一个类,覆盖了OnPaintBackground
并且不调用了基本方法。最后,我将以下代码添加到派生面板的构造函数中:
base.DoubleBuffered = true;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();
答案 0 :(得分:4)
人工制品的原因是,在调整表格大小时,不会重绘整个表面;只有必要的部分。通常最好的解决方案是您不想做的事情,在每次调整大小时调用Invalidate
。但是,如果这实际上是您的情况,请改用PictureBox
。如果不是,您可以考虑在表单中覆盖OnPaint
,并使用this.SetStyle(ControlStyles.ResizeRedraw, true)
自动执行此操作。