在调整大小时将图像绘制到Panel控件上会产生伪像

时间:2012-03-17 15:49:15

标签: c# winforms drawing onpaint

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

在Windows窗体中将图像绘制到Panel control 的完整区域。 (请暂时忽略我可以使用BackgroundImage property

要绘制的图像如下所示:

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旁边)

更新,解决方案:

感谢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();

1 个答案:

答案 0 :(得分:4)

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