C# 在面板控件上绘制图像会在调整大小时产生伪影

C# 在面板控件上绘制图像会在调整大小时产生伪影,c#,winforms,drawing,onpaint,C#,Winforms,Drawing,Onpaint,目前,我正在尝试做一件我认为很简单的事情: 在Windows窗体中的整个区域上绘制图像。(请暂时忽略,我可以使用) 要绘制的图像如下所示: 即,一个周围有1像素蓝色边框的黄色框 要绘制,我使用面板控件的绘制事件: private void panel1_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle); } 这在最初显示表单时

目前,我正在尝试做一件我认为很简单的事情:

在Windows窗体中的整个区域上绘制图像。(请暂时忽略,我可以使用)

要绘制的图像如下所示:

即,一个周围有1像素蓝色边框的黄色框

要绘制,我使用
面板
控件的
绘制
事件:

private void panel1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(Resources.MyImage, panel1.ClientRectangle);
}
这在最初显示表单时看起来很好:

当调整窗体(以及停靠面板)的大小时,它会在变小时剪切边缘

…或者它在放大时绘制人工制品:

我很确定这是一件非常简单和直接的事情,但我真的不明白原因

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

我的问题是:

  • 这些文物的原因是什么?(我很想理解这一点!)
  • 我该怎么做才能扔掉这些手工艺品?(在每次调整大小时调用
    Invalidate
    旁边)
更新,解决方案:

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

base.DoubleBuffered = true;

SetStyle(ControlStyles.AllPaintingInWmPaint, true);
SetStyle(ControlStyles.ResizeRedraw, true);
SetStyle(ControlStyles.UserPaint, true);
SetStyle(ControlStyles.OptimizedDoubleBuffer, true);

UpdateStyles();

这些人工制品的原因是,调整形状大小时,整个曲面不会重新绘制;只有必要的部件才可以安装。通常最好的解决方案是您不想做的事情,在每次调整大小时调用
Invalidate
。但是,如果这是您的实际情况,只需使用
PictureBox
。如果不是,您可以考虑在您的窗体中重写<代码> OnPaint <代码>,并使用<代码>此。StType(控件SyrSel.RsiSeleDead,true)< /C>自动执行此操作。< /P>在调用<代码>无效> <代码>时,是否有减少闪烁的机会?(我确实认为这来自于首先绘制的背景)可能是背景绘制/填充的转换?@UweKeim:您需要启用双缓冲;子类
面板
,使用
OnPaint
而不是处理
Paint
,并将
DoubleBuffered
属性设置为
true
。该属性可能重复