Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# 拖离屏幕时出现图形错误_C#_.net - Fatal编程技术网

C# 拖离屏幕时出现图形错误

C# 拖离屏幕时出现图形错误,c#,.net,C#,.net,我编写了这段代码,它将在面板周围创建圆角边框 public void DrawRoundRect(Graphics g, Pen p, float X, float Y, float width, float height, float radius) { GraphicsPath gp = new GraphicsPath(); //Upper-right arc: gp.AddArc(X + width - (radius * 2), Y, radius * 2, r

我编写了这段代码,它将在面板周围创建圆角边框

public void DrawRoundRect(Graphics g, Pen p, float X, float Y, float width, float height, float radius)
{
    GraphicsPath gp = new GraphicsPath();
    //Upper-right arc:
    gp.AddArc(X + width - (radius * 2), Y, radius * 2, radius * 2, 270, 90);
    //Lower-right arc:
    gp.AddArc(X + width - (radius * 2), Y + height - (radius * 2), radius * 2, radius * 2, 0, 90);
    //Lower-left arc:
    gp.AddArc(X, Y + height - (radius * 2), radius * 2, radius * 2, 90, 90);
    //Upper-left arc:
    gp.AddArc(X, Y, radius * 2, radius * 2, 180, 90);
    gp.CloseFigure();
    g.DrawPath(p, gp);
    gp.Dispose();
}

private void panel_Paint(object sender, PaintEventArgs e)
{
    Graphics v = e.Graphics;
    DrawRoundRect(v, Pens.White, e.ClipRectangle.Left, e.ClipRectangle.Top, e.ClipRectangle.Width - 1, e.ClipRectangle.Height - 1, 10);
    base.OnPaint(e);
}
它工作正常,直到它离开屏幕,出现以下情况:

有人知道我做错了什么,或者如何解决问题吗?

你误解了ClipRectangle的意思

它不会告诉你面板有多大——它会告诉你要重新绘制面板的哪个部分。当您将表单移出屏幕时,它需要重新绘制更改了监视器的部分,而不是保留在原始监视器上的部分。因此,当ClipRectangle是面板的整个区域,并且您的代码正常工作时,它告诉您只重新绘制面板的一部分,而ClipRectangle比您试图绘制的面板小得多

ClipRectangle实际上是一种优化功能。如果你不在乎这个,你可以完全忽略它——只使用0,0,panel.Width,panel.Height。

你误解了ClipRectangle的意思

它不会告诉你面板有多大——它会告诉你要重新绘制面板的哪个部分。当您将表单移出屏幕时,它需要重新绘制更改了监视器的部分,而不是保留在原始监视器上的部分。因此,当ClipRectangle是面板的整个区域,并且您的代码正常工作时,它告诉您只重新绘制面板的一部分,而ClipRectangle比您试图绘制的面板小得多


ClipRectangle实际上是一种优化功能。如果你不在乎这个,你几乎可以完全忽略它-只需使用0,0,panel.Width,panel.Height。

你有两个问题。首先是依靠e.ClipRectangle,这不是面板的大小。您需要改用panel.ClientRectangle。这就是当你把它从屏幕上拖下来再拖回来时,它会被弄脏的原因

你还没有找到下一个,它要微妙得多。面板被设计成一个容器控件,它优化了它的绘制。仅重绘调整大小时显示的零件。非常重要的一点是,这样可以更容易地调整窗口的大小。然而,这将不会很好地工作,像这样的细节,圆角将不会得到正确的重新油漆。看起来像是一种涂抹效果,不如现在那么明显。每当您调整面板大小时,通常使用Dock或Anchor属性,都会发生这种情况


正确的方法是从面板派生自己的类,在构造函数中将ResizeRedraw属性设置为true。通常,您几乎总是希望将DoubleBuffered设置为true,以抑制现在的可见闪烁。或者使用面板的调整大小事件调用panel.Invalidate。

您有两个问题。首先是依靠e.ClipRectangle,这不是面板的大小。您需要改用panel.ClientRectangle。这就是当你把它从屏幕上拖下来再拖回来时,它会被弄脏的原因

你还没有找到下一个,它要微妙得多。面板被设计成一个容器控件,它优化了它的绘制。仅重绘调整大小时显示的零件。非常重要的一点是,这样可以更容易地调整窗口的大小。然而,这将不会很好地工作,像这样的细节,圆角将不会得到正确的重新油漆。看起来像是一种涂抹效果,不如现在那么明显。每当您调整面板大小时,通常使用Dock或Anchor属性,都会发生这种情况


正确的方法是从面板派生自己的类,在构造函数中将ResizeRedraw属性设置为true。通常,您几乎总是希望将DoubleBuffered设置为true,以抑制现在的可见闪烁。或者使用面板的“调整大小”事件“呼叫面板.无效”。

谢谢,这很有帮助!:谢谢,这帮了大忙!:只需要从宽度和高度取1,它就像一个奇迹,谢谢你的帮助和解释。只需要从宽度和高度取1,它就像一个奇迹,谢谢你的帮助和解释