从visualstudio2013面板中复制手绘图在面板/图片框上复制相同的图形(我画的)。它们也不应该是形成一条线的点,而是一条连续的线。请帮忙。使用系统;使用System.Collections.Generic;使用System.ComponentModel;使用系统数据;使用系统绘图;使用System.Linq;使用系统文本;使用System.Threading.Tasks;使用System.Windows.Forms;namespaceWindowsFormsApplication1{publicpartialclassForm1:Form{Penp_white;布尔绘制=真;私有图形对象图形;publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){}privatevoidpanel1_Paint(objectsender,PaintEventArgse){Penp_black=newPen(newSolidBrush(Color.Black));如果(绘制){objgraphics=panel1.CreateGraphics();}}/*privatevoidpanel1_MouseDown(objectsender,MouseEventArgse){booldraw=true;}*/privatevoidpanel1_MouseMove_1(objectsender,MouseEventArgse){RectanglerEllipse=newRectangle();开关(e.Button){caseMouseButtons.Left:rEllipse.X=eX;rEllipse.Y=eY;rEllipse.Width=5;rEllipse.Height=5;objgraphics.DrawEllipse(系统m.Drawing.Pens.Black,rEllipse);休息;案例MouseButtons.Right:rEllipse.X=eX;rEllipse.Y=eY;rEllipse.Width=3;rEllipse.Height=3;objgraphics.DrawEllipse(System.Drawing.Pens.Black,rEllipse);休息;默认值:返回;}}/*privatevoidpanel1_MouseUp(objectsender,MouseEventArgse){booldraw=false;}*/privatevoidform_Paint(objectsender,EventArgse){}privatevoidpanel2_Paint(objectsender,PaintEventArgse){Penp_black=newPen(newSolidBrush(Color.Black));如果(绘制){objgraphics=panel1.CreateGraphics();}}privatevoidbutton2_Click(objectsender,EventArgse){this.Close();}}}看着你的代码恐怕我不得不说:这都是错误的很抱歉这么直率,但你绝不能使用control.CreateGraphics!!存储图形对象(几乎)总是错误的!相反,您必须使用从控件的Paint事件中的e.Graphics参数获得的那个。请注意,Graphics不包含任何图形,它是一种用于绘制到关联位图或控制表面的工具。DrawCurve有一个很好的绘制平滑线条的方法。你给它一个Pen和一系列的Points。这就是我们将要使用的。让我们回到基础:如何创建图形?现在我们知道您需要在Paint事件中调用DrawCurve:e.Graphics.DrawCurve(somePen,somePointsArray);这就引出了下一个问题:还有一个隐藏的第三个问题:第一个很简单;你为5.5pxPenPensomePen=newPen(Color.Blue,5.5f)创建一个笔画宽度;如果你愿意,你也可以给它一个线型(破折号)。现在对于数组:以最简单的形式,这也很容易。在MouseMove事件中,您将当前位置存储在点列表中。首先我们在类级别声明它:ListcurrentLine=newList();然后我们在按下左键时开始填充它:panel1.无效();注意最后一行:在控件上调用Invalidate会触发系统调用Paint事件。它可能看起来很复杂,但它是唯一正确的方法,因为它保证在某些其他原因需要时会发生相同的绘图。我们需要绘制,因为我们已经更改了应该绘制的数据。但是有许多外部原因,最臭名昭著的是最小化/最大化序列,它清除绘图并触发Paint事件。所以我们需要匹配windows绘制控件的方式!只有这样图形才会持续存在。另请注意,我们不使用数组,因为我们不知道需要多少点。相反,我们使用列表,然后将其转换为数组。让我们为简单情况编写Paint事件代码:privatevoidpanel1_Paint(objectsender,PaintEventArgse){using(PensomePen=newPen(Color.Blue,5.5f))if(currentLine.Count>1)e.Graphics.DrawCurve(yourPen,currentLine.ToArray());请注意,我在using子句中创建了Pen。这是确保您的笔得到妥善处理的一种廉价且安全的方法。还要注意我们是如何将List转换为Array的!上面的代码可以独立运行,并允许您自由绘制一条线。但是下一行呢?应该不是和第一个连在一起的,所以不能随便加点!所以我们不只是需要一个点列表,而是更多的点,实际上是一个点列表列表:Listcurves=newList>();每当鼠标被释放时,我们将当前曲线添加到它:privatevoidpanel1_MouseUp(objectsender,MouseEventArgse){if(currentLine.Count>1)curves.Add(currentLine.ToList());//复制!!currentLine.Clear();panel1.无效();注意我是如何使用从List到List强制复制的,否则只需分配一个引用,然后在下一行清除。我们再次触发Paint事件作为最后一件事。我们现在应该更改Paint事件以显示所有行,包括当前正在绘制的行和所有较早的行..:privatevoidpanel1_Paint(objectsender,PaintEventArgse){using(PensomePen=newPen(Color.Blue,5.5f)){if(currentLine.Count>1)e.Graphics.DrawCurve(somePen,currentLine.ToArray());foreach(Listlpincurves)if(lp.Count>1)e.Graphics.DrawCurve(somePen,lp.ToArray());}}至此徒手绘制部分就基本完成了。所以我们回到你原来的问题:你如何将绘图复制到第二个Panel?好了,您已经将所有内容存储在曲线数据结构中。所以你有两个选择:要么在panel2_Paint事件中使用相同的数据,要么你需要复制和更改数据,可能以适应不同的大小。所以不是代码编写服务。所以通常我不应该给你比我在上面的评论中写的更多的提示。但是当这个问题经常出现时,我编写了一个非常基本的涂鸦应用程序的完整代码。这是仍然缺少的内容:这是清除代码:curves.Clear();currentLine.Clear();panel1.无效();我注意到您的原始代码允许您使用左右按钮绘制两种不同的笔划宽度。仅此一点就表明这段代码不是很好。谁会a)想到那个并且b)满足于只有两个笔画宽度..阅读这篇文章,我将解释如何创建一个可以存储笔宽、颜色等以进行更改的类。以上就是C#学习教程:复制VisualStudio2013面板免费手绘分享的全部内容,如果对大家有用,需要详细了解C#学习教程,希望大家点赞更多的关注它。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
