目前我正在尝试做我认为是一项简单的任务:
Panel
在 Windows 窗体中的控件的整个区域上绘制图像。(请暂时忽略我可以使用该BackgroundImage
属性的那一刻)
要绘制的图像如下所示:
即一个黄色框,周围有一个 1 像素的蓝色框。
要绘制,我正在使用控件的Paint
事件Panel
:
private void panel1_Paint(object sender, PaintEventArgs e)
{
e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle);
}
最初显示表单时,这看起来不错:
在调整表单(以及停靠面板)的大小时,它要么在变小时切割边缘......
...或者当它变大时,它会绘制人工制品:
我很确定发生了一些相当简单直接的事情,但我真的无法理解原因。
由于我忽略ClipRectangle
并始终绘制所有内容,因此我认为图像会一直缩放。
我的问题是:
- 文物出现的原因是什么?(我喜欢理解这一点!)
- 为了摆脱人工制品,我必须做什么?(除了调用
Invalidate
每次调整大小)
更新,解决方案:
感谢Ryan 的回答,我能够找到一个可以接受的解决方案。基本上,我从 派生了一个类Panel
,覆盖OnPaintBackground
并没有调用基方法。最后,我将以下代码添加到派生面板的构造函数中:
base.DoubleBuffered = true;
SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
UpdateStyles();