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