C# 如何删除表单上的绘制线?

C# 如何删除表单上的绘制线?,c#,graphics,line,eraser,C#,Graphics,Line,Eraser,事实上,关于这个话题有一些类似的问题,但我看不出我想要的答案 例如,我在windows窗体上画了两条线,我想删除其中一条,保留另一条,,我该怎么做 this.Invalidate()或图形。清除()清除所有表单,我不想这样,我想删除特定行。您还有其他解决方案吗?以下内容将按相反的时间顺序删除所有创建的行 Graphics g; Pen p; Bitmap bmp; List<Point> Lines = new List<Point>();

事实上,关于这个话题有一些类似的问题,但我看不出我想要的答案

例如,我在windows窗体上画了两条线,我想删除其中一条,保留另一条,,我该怎么做


this.Invalidate()
图形。清除()清除所有表单,我不想这样,我想删除特定行。您还有其他解决方案吗?

以下内容将按相反的时间顺序删除所有创建的行

    Graphics g;
    Pen p;
    Bitmap bmp;
    List<Point> Lines = new List<Point>();

    private void Form2_Load(object sender, EventArgs e)
    {
        bmp = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
        BackgroundImage = bmp;
        g = Graphics.FromImage(BackgroundImage);
        g.Clear(Color.DeepSkyBlue); //This is our backcolor
    }

    private void btnLine1_Click(object sender, EventArgs e)
    {
        Point A = new Point(50, 50);
        Point B = new Point(100, 50);
        p = new Pen(Color.Red);
        g.DrawLine(p, A, B); //Use whatever method to draw your line
        Lines.Add(A); //Grab the first point; add to list
        Lines.Add(B); //Grab the second point; add to list
        Refresh(); //Refresh drawing to bitmap.
    }

    private void btnDrawLine2_Click(object sender, EventArgs e)
    {
        Point A = new Point(50, 60);
        Point B = new Point(100, 60);
        p = new Pen(Color.White);
        g.DrawLine(p, A, B); //Same logic as above
        Lines.Add(A);
        Lines.Add(B);
        Refresh();
    }

    private void btnUndo_Click(object sender, EventArgs e)
    {
        c = new Pen(Color.DeepSkyBlue);
        r = new Pen(lastColor.ElementAt(lastColor.Count - 2));
        try
        {
            g.DrawLine(c, Lines.ElementAt(Lines.Count - 2), Lines.ElementAt(Lines.Count - 1));
            Lines.RemoveAt(Lines.Count - 2);
            Lines.RemoveAt(Lines.Count - 1);
            for (int i = Lines.Count; i > 0; i--)
            {
            g.DrawLine(r, Lines.ElementAt(Lines.Count - 2), Lines.ElementAt(Lines.Count - 1));
            }
        }
        catch { }
        Refresh();
    }
Graphics;
钢笔p;
位图bmp;
列表行=新列表();
私有void Form2_加载(对象发送方、事件参数e)
{
bmp=新位图(宽度、高度、系统、绘图、成像、像素格式、格式24bpprgb);
背景图像=bmp;
g=图形。FromImage(背景图像);
g、 清晰(颜色。深蓝);//这是我们的背景色
}
私有无效btnLine1_单击(对象发送者,事件参数e)
{
点A=新点(50,50);
点B=新点(100,50);
p=新笔(颜色为红色);
g、 画线(p,A,B);//用任何方法画线
line.Add(A);//抓住第一个点;添加到列表
line.Add(B);//抓住第二点;添加到列表
Refresh();//将图形刷新为位图。
}
私有无效btnDrawLine2_单击(对象发送者,事件参数e)
{
点A=新点(50,60);
点B=新点(100,60);
p=新笔(颜色为白色);
g、 抽绳(p,A,B);//与上述逻辑相同
行。添加(A);
行。添加(B);
刷新();
}
私有void btundo\u单击(对象发送方,事件参数e)
{
c=新笔(颜色:深蓝);
r=新笔(lastColor.ElementAt(lastColor.Count-2));
尝试
{
g、 抽绳(c,Lines.ElementAt(Lines.Count-2),Lines.ElementAt(Lines.Count-1));
Lines.RemoveAt(Lines.Count-2);
Lines.RemoveAt(Lines.Count-1);
对于(int i=Lines.Count;i>0;i--)
{
g、 抽绳(r,Lines.ElementAt(Lines.Count-2),Lines.ElementAt(Lines.Count-1));
}
}
捕获{}
刷新();
}
这里有两行并排排列:

这里有两行重叠:


*请记住处置图形对象

不要使用CreateGraphics!!唯一的方法是从绘制的线列表中删除要删除的线。在绘画活动中,始终一次性绘制所有形状。如果您没有这样一个要绘制的形状列表,那么您应该有。你需要它。相信我们。忽略所有其他方面的愚蠢建议,从MSDN关于绘画的可怕介绍到(很抱歉)对“纸上画的线”的误导性类比。这完全不同。事实上,这是完全不同的!!!你可能想学习简单的回答是:你没有线条,你只是给像素上色。并且:无法取消绘制像素,因此需要重新创建整个图形。听起来很疯狂,很浪费,但这是唯一可行的方法,而且速度惊人。当你画线时,把它添加到列表中。如果要撤消,请使用与列表中容器背景相同的颜色重新绘制行。感谢您的建议,提供参考文章和示例代码@HansPassant、Taw和Alex Diamond,我将根据这些注释刷新代码。非常感谢。画一条线与另一条线交叉,并观察它同时删除基础线的位。只需使用视图模型使一个函数负责所有绘制。然后,用于添加新线的按钮不需要绘制任何东西,它们只需更新视图模型。您现在拥有的是大量的复制,几乎无法维护。实际上,我现在对视图模型一无所知,但我会搜索它!感谢您的建议Ben Voigt.
。新钢笔(lastColor.ElementAt(lastColor.Count-2))lastColor来自哪里?这不管用。