在resize时将图像绘制到Panel控件上会产生伪影

目前我正在尝试做我认为简单的任务:

在Windows窗体中的Panel控件的整个区域上绘制图像 。 (请忽略我可以使用BackgroundImage属性的那一刻)

要绘制的图像如下所示:

在此处输入图像描述

即一个黄色的盒子,周围有一个1像素的蓝色框架。

要绘制,我正在使用Panel控件的Paint事件:

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

这在最初显示表单时看起来很好:

在此处输入图像描述

调整窗体大小(以及停靠的面板)时,它会在缩小时缩小边缘…

在此处输入图像描述

…或者当它变得更大时它会绘制人工制品:

在此处输入图像描述

我很确定有一些相当简单和直接的东西,但我真的无法理解其中的原因。

因为我忽略了ClipRectangle并总是绘制所有内容,所以我认为图像会一直缩放。

我的问题是:

  • 这些文物的原因是什么? (我喜欢理解这一点!)
  • 为了摆脱人工制品,我该怎么做? (在每次resize时调用Invalidate旁边)

更新,解决方案:

感谢Ryan的回答 ,我找到了一个可接受的解决方案。 基本上我从Panel派生了一个类,重写了OnPaintBackground并且没有调用基本方法。 最后,我将以下代码添加到派生面板的构造函数中:

 base.DoubleBuffered = true; SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.ResizeRedraw, true); SetStyle(ControlStyles.UserPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); UpdateStyles(); 

人工制品的原因是,在调整表格大小时,不会重绘整个表面; 只有必要的部分。 通常最好的解决方案是您不想做的事情,在每次resize时调用Invalidate 。 但是,如果这实际上是您的情况,请改用PictureBox 。 如果不是,您可以考虑在表单中覆盖OnPaint ,并使用this.SetStyle(ControlStyles.ResizeRedraw, true)自动执行此操作。