如何在简单的绘画应用程序中清除面板

时间:2011-05-20 12:28:43

标签: c# winforms

我正在开发一个简单的Windows窗体绘制应用程序。我在清理面板时遇到问题。我用来绘制的代码是

private void panel1_Paint(object sender, PaintEventArgs e)
{
    Graphics g = Graphics.FromImage(tempDraw);
    Pen myPen = new Pen(foreColor, lineWidth);
    g.DrawLine(myPen, x1, y1, x2, y2);
    myPen.Width = 100;
    myPen.Dispose();
    e.Graphics.DrawImageUnscaled(tempDraw, 0, 0);
    g.Dispose();
 }

如何清除面板?

3 个答案:

答案 0 :(得分:2)

是否正在绘制Panel实例的绘制处理程序?如果没有,那么在面板上调用Invalidate会这样做。

但是您可能会持久保存绘图项目,因此要清除它们,您需要删除绘制的内容,然后调用Invalidate。您也可以使用FillRect为Panel填充特定的颜色,但这将是一个肮脏的解决方法,不适合您的最终设计。

您还应该查看CodeProject.com以获取示例like this one,以便了解在创建此类绘图应用时需要处理的内容。

修改

根据编辑的答案,您无法使用现有逻辑清除面板。你正在绘制表单的Paint处理程序,它将在需要重绘时发生。这意味着您应该改变您的方法。你需要在Paint处理程序中使用某种条件,它决定它是否会绘制任何东西。这是绘图对象的持久性进入的地方。如果要创建绘图程序,则必须在面板对象上处理鼠标Down,Up和Move事件,并将数据存储在点数组中。 (作为一种绘图的示例。)然后在您的Paint处理程序中,如果Points []不为空,则绘制点。否则你什么都不画......最后是一个空的容器。然后,如果您需要清除图形,则删除Points数组的内容并在Panel上调用Invalidate。这将清除持久化数据并重新粉碎。

答案 1 :(得分:2)

您可以使用

Panel1.Invalidate();

但是这有一个问题,在你调用这个函数之后它清除了面板中的所有图形,但它也回想起了这个函数,即

private void panel1_Paint(object sender, PaintEventArgs e)
{
    //This function is recalled after Panel1.Invalidate();
}

因此,解决方案是在其他功能中使用油漆代码

private void MyDrawing()
{
    Graphics g = Graphics.FromImage(tempDraw);
    // if above line doesn't work you can use the following commented line
    //Graphics g = Graphics.Panel1.CreateGraphics();

    Pen myPen = new Pen(foreColor, lineWidth);
    g.DrawLine(myPen, x1, y1, x2, y2);
    myPen.Width = 100;
    myPen.Dispose();
    Panel1.Graphics.DrawImageUnscaled(tempDraw, 0, 0);
    g.Dispose();
 }

答案 2 :(得分:0)

您必须使用您正在使用的任何基色再次绘制面板,例如。使用Graphics.FillRectangle方法的白色\灰色:

// Create solid brush.
SolidBrush whiteBrush = new SolidBrush(Color.White);
// Create location and size of rectangle.
// Fill rectangle to screen.
e.Graphics.FillRectangle(whiteBrush, panel.Location.X, panel.Location.Y, panel.Width, panel.Height);
this.Invalidate();