7

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

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();
4

1 回答 1

5

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

于 2012-03-17T15:54:52.953 回答