C# 在面板控件上绘制图像会在调整大小时产生伪影
目前,我正在尝试做一件我认为很简单的事情: 在Windows窗体中的整个区域上绘制图像。(请暂时忽略,我可以使用) 要绘制的图像如下所示: 即,一个周围有1像素蓝色边框的黄色框 要绘制,我使用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); } 这在最初显示表单时
面板
控件的绘制
事件:
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
。该属性可能重复