用于绘画应用程序的可定制的椭圆

我一直在用C#绘制应用程序。 我想添加一个选项来切换用当前画笔绘制椭圆。 我一直在困难如何使它的椭圆的大小和Y位置变化,而按住鼠标。 有任何想法吗? 这是我的代码。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ZSPainter { public partial class Form1 : Form { string drawToolString; Graphics g; bool c = false; bool drawEllipse = false; Point sp = new Point(0, 0); Point ep = new Point(0, 0); Pen p = new Pen(Color.Black, 1); Brush b = new SolidBrush(Color.Black); public Form1() { InitializeComponent(); } private void penToolStripMenuItem_Click(object sender, EventArgs e) { drawToolString = "pen"; toolString.Text = "Current Tool: Pen"; } private void brushToolStripMenuItem_Click(object sender, EventArgs e) { drawToolString = "brush"; toolString.Text = "Current Tool: Brush"; } private void Form1_MouseDown(object sender, MouseEventArgs e) { sp = e.Location; if(e.Button == MouseButtons.Left) c = true; } private void Form1_MouseMove(object sender, MouseEventArgs e) { if (drawToolString == "pen" && c) { ep = e.Location; g = this.CreateGraphics(); if(!drawEllipse) g.DrawLine(p, sp, ep); /*else * *------Here is where I want an ellipse to drawn if drawEllipse is true.------ */ } else if (drawToolString == "brush" && c) { ep = e.Location; g = this.CreateGraphics(); if(!drawEllipse) g.DrawLine(new Pen(b, 3), sp, ep); /*else * *------Here is where I want an ellipse to drawn if drawEllipse is true.------ */ } sp = ep; } private void Form1_MouseUp(object sender, MouseEventArgs e) { c = false; } private void ellipse_Click(object sender, EventArgs e) { drawEllipse = !drawEllipse; } } } 

使用透明背景的图片框,并且已经从图像文件(每个示例)中绘制椭圆,并将其放在鼠标坐标处。

但是要小心,这会给你的代码带来很多麻烦,你正在绘制到表单上,当它刷新的时候,所有的东西都会在刷新的区域被清除,所以如果你放置并移动一个控件,它将被清除。

我建议创建一个位图,将此位图设置为您的窗体的背景,并绘制到该位图,然后它将是持久的(也将更容易保存)。

此外,您需要在MouseDown事件上设置鼠标捕获并在MouseUp上释放,否则在显示图片框后表单不会捕获MouseMove事件。

如果您不想使用图片框,但是将绘图切换为位图,则可以在窗体上绘制并刷新以前绘制椭圆的区域,这样绘图将被保留,并且椭圆将移过它。