Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在OnPaint()上绘制会在调整窗口大小时产生残余_C#_Winforms - Fatal编程技术网

C# 在OnPaint()上绘制会在调整窗口大小时产生残余

C# 在OnPaint()上绘制会在调整窗口大小时产生残余,c#,winforms,C#,Winforms,我已经创建了一个自定义面板来绘制边框(由两个矩形组成)。问题是,如果我调整窗口的大小,仍然会有残留。。。很像WindowsXP的纸牌游戏的动画。请参见下面的屏幕截图。我向右调整了窗口的大小 出了什么问题,我该如何解决 更新 起初我认为这是因为我没有删除之前绘制的矩形。所以我调用了FillRectangle来删除里面的内容 var contentArea = inner; contentArea.X++; contentArea.Y++; contentArea.Width -= 2; cont

我已经创建了一个自定义面板来绘制边框(由两个矩形组成)。问题是,如果我调整窗口的大小,仍然会有残留。。。很像WindowsXP的纸牌游戏的动画。请参见下面的屏幕截图。我向右调整了窗口的大小

出了什么问题,我该如何解决

更新

起初我认为这是因为我没有删除之前绘制的矩形。所以我调用了
FillRectangle
来删除里面的内容

var contentArea = inner;
contentArea.X++;
contentArea.Y++;
contentArea.Width -= 2;
contentArea.Height -= 2;
e.Graphics.FillRectangle(SystemBrushes.Control, contentArea);

但它也不起作用。控件似乎只绘制新扩展的部分,而不是整个区域。

表单类已优化为容器控件。容器通常只有一个要绘制的背景色。所以,正如您所注意到的,“只绘制新扩展的部分”。或者更准确地说,它不会过度渲染之前的像素,很容易从产生的涂抹效果中识别。当你调整窗口的大小时,让Winforms设计更生动是一种有点无力的尝试,当窗体有很多控件时,绘画会成为一个瓶颈,这是很明显的

必须将其ResizeRedraw属性设置为true,以便在必要时重新绘制整个曲面。当图形代码变得复杂并且您开始注意到闪烁时,将DoubleBuffered属性设置为true可能也不会有任何影响

因此,大致上:

    public Form1() {
        InitializeComponent();
        this.ResizeRedraw = true;
        this.DoubleBuffered = true;
    }

优化OnPaint()通常不是一个有回报的策略,Windows本身已经剪辑了您在脏区域绘制的内容。

表单类被优化为一个容器控件。容器通常只有一个要绘制的背景色。所以,正如您所注意到的,“只绘制新扩展的部分”。或者更准确地说,它不会过度渲染之前的像素,很容易从产生的涂抹效果中识别。当你调整窗口的大小时,让Winforms设计更生动是一种有点无力的尝试,当窗体有很多控件时,绘画会成为一个瓶颈,这是很明显的

必须将其ResizeRedraw属性设置为true,以便在必要时重新绘制整个曲面。当图形代码变得复杂并且您开始注意到闪烁时,将DoubleBuffered属性设置为true可能也不会有任何影响

因此,大致上:

    public Form1() {
        InitializeComponent();
        this.ResizeRedraw = true;
        this.DoubleBuffered = true;
    }

优化OnPaint()通常不是一个有回报的策略,Windows本身已经剪辑了您在脏区域绘制的内容。

它可以工作,但我只是想知道这是否是推荐的方法。我的意思是,我知道不是所有的区域都需要重新绘制(在上面的更新中,我填充了整个内容区域只是为了确保,作为一个快速而肮脏的解决方案)。我可以指定需要更新的区域吗?您不指定区域,是操作系统指定的。作为e.ClipRectangle属性传递给您。实际上使用它,嗯,很难与已经使用它的操作系统竞争。好的,当图形对象完全位于剪辑矩形之外时,可以避免在自己的代码中接触大量数据。你所拥有的还远远不够资格。这是可行的,但我只是想知道这是否是推荐的方法。我的意思是,我知道不是所有的区域都需要重新绘制(在上面的更新中,我填充了整个内容区域只是为了确保,作为一个快速而肮脏的解决方案)。我可以指定需要更新的区域吗?您不指定区域,是操作系统指定的。作为e.ClipRectangle属性传递给您。实际上使用它,嗯,很难与已经使用它的操作系统竞争。好的,当图形对象完全位于剪辑矩形之外时,可以避免在自己的代码中接触大量数据。你所拥有的远远不符合这个条件。