在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)
自动执行此操作。