Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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#_Picturebox_System.drawing_Drawrectangle - Fatal编程技术网

C# 如何删除图片框上绘制的所有矩形?(图片上没有)

C# 如何删除图片框上绘制的所有矩形?(图片上没有),c#,picturebox,system.drawing,drawrectangle,C#,Picturebox,System.drawing,Drawrectangle,我已尝试使用以下代码: pictureBox1.Invalidate(); //or pictureBox1.Update(); //or Refresh(); 但它什么也没做。我想清除图片框中所有绘制的图形,因为单击下一页后,我想在其上绘制新的矩形。所以,请不要向我提供这样的解决方案: g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pictureBox1.

我已尝试使用以下代码:

        pictureBox1.Invalidate(); 
        //or
        pictureBox1.Update();
        //or
        Refresh();
但它什么也没做。我想清除图片框中所有绘制的图形,因为单击下一页后,我想在其上绘制新的矩形。所以,请不要向我提供这样的解决方案:

g.FillRectangle(Brushes.Black, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height))

有人想和我分享解决方案吗?我很感激

表格2.cs

    private void pictureBox1_Paint(object sender, PaintEventArgs e)
    {
        Pen pen = new Pen(Color.Red, 2);
        e.Graphics.DrawRectangle(pen, rect);     
    }


    bool draw;
    int x_start, y_start;
    Rectangle rect;
    //UserRect rect;
    private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {

        }
        else if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            pictureBox1.Cursor = Cursors.Cross;
            draw = true;
            x_start = e.X;
            y_start = e.Y;
        }
    }

    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {


        }else if(e.Button == MouseButtons.Right)
        {
            pictureBox1.Cursor = Cursors.Cross;

        }

        if (!draw) return;
        LocalMousePosition = pictureBox1.PointToClient(Cursor.Position);

        int x = Math.Min(x_start, LocalMousePosition.X);
        int y = Math.Min(y_start, LocalMousePosition.Y);

        int width = Math.Max(x_start, LocalMousePosition.X) - Math.Min(x_start, LocalMousePosition.X);
        int height = Math.Max(y_start, LocalMousePosition.Y) - Math.Min(y_start, LocalMousePosition.Y);

        rect = new Rectangle(x, y, width, height);

        xx = x;
        yy = y;
        ww = width;
        hh = height;

        Refresh();
    }

    private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
    {


        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {

            //pictureBox1.Cursor = Cursors.Default;
            draw = false;

            rectang = new UserRect(rect);
            rect = new Rectangle(e.X, e.Y, 0, 0);

            rectang.SetPictureBox(this.pictureBox1);   
        }
        else if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {
        pictureBox1.Cursor = Cursors.Default;
        _tracking = false;

        }


    }
UserRect.cs

public void Draw(Graphics g)
    {
        g.DrawRectangle(new Pen(Color.Green), rect);

        foreach (PosSizableRect pos in Enum.GetValues(typeof(PosSizableRect)))
        {
            g.DrawRectangle(new Pen(Color.Red), GetRect(pos));
        }


    }

        public void SetPictureBox(PictureBox p)
    {
        this.mPictureBox = p;
        mPictureBox.MouseDown += new MouseEventHandler(mPictureBox_MouseDown);
        mPictureBox.MouseUp += new MouseEventHandler(mPictureBox_MouseUp);
        mPictureBox.MouseMove += new MouseEventHandler(mPictureBox_MouseMove);
        mPictureBox.Paint += new PaintEventHandler(mPictureBox_Paint);
    }

    private void mPictureBox_Paint(object sender, PaintEventArgs e)
    {

        try
        {
            Draw(e.Graphics);
        }
        catch (Exception exp)
        {
            System.Console.WriteLine(exp.Message);
        }

    }

    private void mPictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        mIsClick = true;

        nodeSelected = PosSizableRect.None;
        nodeSelected = GetNodeSelectable(e.Location);

        if (rect.Contains(new Point(e.X, e.Y)))
        {
            mMove = true;
        }
        oldX = e.X;
        oldY = e.Y;
    }

    private void mPictureBox_MouseUp(object sender, MouseEventArgs e)
    {
        //MessageBox.Show(rect.ToString());
        mIsClick = false;
        mMove = false;


    }

     private void mPictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        ChangeCursor(e.Location);
        if (mIsClick == false)
        {
            return;
        }

        Rectangle backupRect = rect;

        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {

            switch (nodeSelected)
            {
                case PosSizableRect.LeftUp:
                    rect.X += e.X - oldX;
                    rect.Width -= e.X - oldX;
                    rect.Y += e.Y - oldY;
                    rect.Height -= e.Y - oldY;
                    break;
                case PosSizableRect.LeftMiddle:
                    rect.X += e.X - oldX;
                    rect.Width -= e.X - oldX;
                    break;
                case PosSizableRect.LeftBottom:
                    rect.Width -= e.X - oldX;
                    rect.X += e.X - oldX;
                    rect.Height += e.Y - oldY;
                    break;
                case PosSizableRect.BottomMiddle:
                    rect.Height += e.Y - oldY;
                    break;
                case PosSizableRect.RightUp:
                    rect.Width += e.X - oldX;
                    rect.Y += e.Y - oldY;
                    rect.Height -= e.Y - oldY;
                    break;
                case PosSizableRect.RightBottom:
                    rect.Width += e.X - oldX;
                    rect.Height += e.Y - oldY;
                    break;
                case PosSizableRect.RightMiddle:
                    rect.Width += e.X - oldX;
                    break;

                case PosSizableRect.UpMiddle:
                    rect.Y += e.Y - oldY;
                    rect.Height -= e.Y - oldY;
                    break;

                default:
                    if (mMove)
                    {
                        rect.X = rect.X + e.X - oldX;
                        rect.Y = rect.Y + e.Y - oldY;
                    }
                    break;
        }
    }
        oldX = e.X;
        oldY = e.Y;

        if (rect.Width < 5 || rect.Height < 5)
        {
            rect = backupRect;
        }

        TestIfRectInsideArea();

        mPictureBox.Invalidate();
    }
public void Draw(图形g)
{
g、 DrawRectangle(新笔(绿色),矩形);
foreach(Enum.GetValues中的PosSizableRect pos(typeof(PosSizableRect)))
{
g、 DrawRectangle(新笔(红色)、GetRect(pos));
}
}
公共无效设置PictureBox(PictureBox p)
{
这个.mpiturebox=p;
mpicurebox.MouseDown+=新的MouseEventHandler(mpicurebox\u MouseDown);
mpicurebox.MouseUp+=新的MouseEventHandler(mpicurebox_MouseUp);
mpicurebox.MouseMove+=新的MouseEventHandler(mpicurebox\u MouseMove);
mpicurebox.Paint+=新的PaintEventHandler(mpicurebox_-Paint);
}
私有void mPictureBox_Paint(对象发送方,PaintEventArgs e)
{
尝试
{
绘画(如图形);
}
捕获(异常扩展)
{
System.Console.WriteLine(exp.Message);
}
}
私有void mPictureBox_MouseDown(对象发送方,MouseEventArgs e)
{
mIsClick=true;
nodeSelected=PosSizableRect.None;
nodeSelected=GetNodeSelectable(如位置);
if(矩形包含(新点(e.X,e.Y)))
{
mMove=true;
}
oldX=e.X;
oldY=e.Y;
}
私有void mPictureBox_MouseUp(对象发送方,MouseEventArgs e)
{
//Show(rect.ToString());
mIsClick=false;
mMove=false;
}
私有void mPictureBox_MouseMove(对象发送方,MouseEventArgs e)
{
更改光标(例如位置);
if(mIsClick==false)
{
返回;
}
矩形backupRect=rect;
if(e.Button==System.Windows.Forms.MouseButtons.Left)
{
开关(已选择节点)
{
case PosSizableRect.LeftUp:
rect.X+=e.X-oldX;
矩形宽度-=e.X-旧X;
矩形Y+=e.Y-旧的;
垂直高度-=e.Y-旧的;
打破
大小写可能为Rect.LeftMiddle:
rect.X+=e.X-oldX;
矩形宽度-=e.X-旧X;
打破
case PosSizableRect.LeftBottom:
矩形宽度-=e.X-旧X;
rect.X+=e.X-oldX;
垂直高度+=e.Y-旧的;
打破
case possizableCrect.BottomMiddle:
垂直高度+=e.Y-旧的;
打破
case possizableCrect.RightUp:
矩形宽度+=e.X-oldX;
矩形Y+=e.Y-旧的;
垂直高度-=e.Y-旧的;
打破
case PosSizableRect.RightBottom:
矩形宽度+=e.X-oldX;
垂直高度+=e.Y-旧的;
打破
大小写可能为Rect.RightMiddle:
矩形宽度+=e.X-oldX;
打破
大小写可能为rect.UpMiddle:
矩形Y+=e.Y-旧的;
垂直高度-=e.Y-旧的;
打破
违约:
如果(mMove)
{
rect.X=rect.X+e.X-oldX;
rect.Y=rect.Y+e.Y-oldY;
}
打破
}
}
oldX=e.X;
oldY=e.Y;
if(直线宽度<5 | |直线高度<5)
{
rect=backupRect;
}
Testifrectinidearea();
mpicurebox.Invalidate();
}

通常,我会在“绘制事件”(用于交互式绘制,如选择框和鼠标移动相关内容)和单独的参考底图图像之间分割图形

这有几个原因,例如对要绘制的内容的控制(假设您只想绘制重角1、3和5,如果未选中某个复选框,则绘制所有1到6,如果选中),以及性能(具有大量数据)。 你可以用油漆做所有这些,但它会膨胀。与此相反,您可以将绘图任务拆分为多个函数,这对于大型绘图非常方便

非常简单的示例-VB.NET:

Dim UnderlayingImage as Image
UnderLayingImage = New Bitmap(Me.PictureBox1.Width, Me.Picturebox1.Height)

Dim g As Graphics = Graphics.FromImage(UnderLayingImage)
Dim bgBrush As SolidBrush = New SolidBrush(Color.LightSlateGray)
Dim bgBrushWhite As SolidBrush = New SolidBrush(Color.White)
Dim shPen As Pen = New Pen(Color.Black)

Dim rect As RectangleF = New RectangleF(50, 50, 100, 100)
g.FillRectangle(bgBrush, rect)
g.DrawRectangle(Pens.Black, Rectangle.Round(rect))

Me.PictureBoxDrawing.Image = UnderLayingImage 
翻译成C#:


回到你的问题:这样你就不会清除你的画,但是你重新画了它,在这个过程中,你决定要包括什么和要添加什么

你需要给我们看更多的代码。
g
是来自
Paint
事件
e.Graphics
,还是来自
Graphics.FromImage(bmp)
。后者将持久地绘制到位图中。前者将绘制事件中的所有数据绘制到控件上。如果您从例如一个
List
中绘制,您需要做的就是清除该列表,然后
Invalidate
pbox..rect=Rectangle.Empty and Invalidate()强制重新绘制是一种简单的方法。
Dim UnderlayingImage as Image
UnderLayingImage = New Bitmap(Me.PictureBox1.Width, Me.Picturebox1.Height)

Dim g As Graphics = Graphics.FromImage(UnderLayingImage)
Dim bgBrush As SolidBrush = New SolidBrush(Color.LightSlateGray)
Dim bgBrushWhite As SolidBrush = New SolidBrush(Color.White)
Dim shPen As Pen = New Pen(Color.Black)

Dim rect As RectangleF = New RectangleF(50, 50, 100, 100)
g.FillRectangle(bgBrush, rect)
g.DrawRectangle(Pens.Black, Rectangle.Round(rect))

Me.PictureBoxDrawing.Image = UnderLayingImage 
Image UnderlayingImage;
UnderLayingImage = new Bitmap(this.PictureBox1.Width, this.Picturebox1.Height);

Graphics g = Graphics.FromImage(UnderLayingImage);
SolidBrush bgBrush = new SolidBrush(Color.LightSlateGray);
SolidBrush bgBrushWhite = new SolidBrush(Color.White);
Pen shPen = new Pen(Color.Black);

RectangleF rect = new RectangleF(50, 50, 100, 100);
g.FillRectangle(bgBrush, rect);
g.DrawRectangle(Pens.Black, Rectangle.Round(rect));

this.PictureBoxDrawing.Image = UnderLayingImage;