问题描述
最近我正在开发 Windows 窗体中的 Paint 应用程序。我创建了自己的 TaW's code 变体,用于在图片框上进行实时绘画:
enum ArtMode { HandDraw,Erase,Line,Rectangle,Ellipse,Circle,Autopainter }
class ArtManager
{
Pen pen;
public void Draw(PaintEventArgs G,List<ArtAction> actions)
{
foreach (ArtAction da in actions)
{
pen = new Pen(da.color,da.width);
if (da.points.Count > 1)
{
if (da.artMode == ArtMode.HandDraw)
G.Graphics.DrawCurve(pen,da.points.ToArray());
else if (da.artMode == ArtMode.Erase)
G.Graphics.DrawCurve(new Pen(da.color,da.width),da.points.ToArray());
else if (da.artMode == ArtMode.Line)
G.Graphics.DrawLine(pen,da.points[0],da.points[da.points.Count - 1]);
else if (da.artMode == ArtMode.Rectangle)
G.Graphics.DrawRectangle(pen,Math.Min(da.points[0].X,da.points[da.points.Count - 1].X),Math.Min(da.points[0].Y,da.points[da.points.Count - 1].Y),Math.Abs(da.points[0].X - da.points[da.points.Count - 1].X),Math.Abs(da.points[0].Y - da.points[da.points.Count - 1].Y));
else if (da.artMode == ArtMode.Ellipse)
{
Rectangle rect = new Rectangle((int)Math.Min(da.points[0].X,(int)Math.Min(da.points[0].Y,(int)Math.Abs(da.points[0].X - da.points[da.points.Count - 1].X),(int)Math.Abs(da.points[0].Y - da.points[da.points.Count - 1].Y));
G.Graphics.DrawEllipse(pen,rect);
}
else if (da.artMode == ArtMode.Circle)
{
Rectangle rect = new Rectangle((int)Math.Min(da.points[0].X,(int)Math.Abs(da.points[0].Y - da.points[da.points.Count - 1].Y),rect);
}
}
}
}
}
class ArtAction
{
public Color color;
public float width;
public ArtMode artMode;
public List<PointF> points;
public ArtAction(Color color,float width,ArtMode artMode)
{
this.color = color;
this.width = width;
this.artMode = artMode;
points = new List<PointF>();
}
}
表单代码:
Pen pen;
ArtMode artMode;
List<ArtAction> actions = new List<ArtAction>();
ArtManager artManager = new ArtManager();
int i = 0;
private void canvas_MouseDown(object sender,MouseEventArgs e)
{
//Setting pen
pen.Width = float.Parse(BrushSizeCB.SelectedItem.ToString());
pen.Color = HandDraw_ColorIndic.BackColor;
if (artMode == ArtMode.HandDraw)
actions.Add(new ArtAction(pen.Color,pen.Width,ArtMode.HandDraw));
else if (artMode == ArtMode.Erase)
actions.Add(new ArtAction(Color.White,ArtMode.Erase));
else if (artMode == ArtMode.Line)
actions.Add(new ArtAction(pen.Color,ArtMode.Line));
else if (artMode == ArtMode.Rectangle)
actions.Add(new ArtAction(pen.Color,ArtMode.Rectangle));
else if (artMode == ArtMode.Ellipse)
actions.Add(new ArtAction(pen.Color,ArtMode.Ellipse));
else if (artMode == ArtMode.Circle)
actions.Add(new ArtAction(pen.Color,ArtMode.Circle));
}
private void canvas_MouseMove(object sender,MouseEventArgs e)
{
Cordinates_X.Text = "X: " + e.X;
Cordinates_Y.Text = "Y: " + e.Y;
if (e.Button == MouseButtons.Left)
{
actions[i].points.Add(e.Location);
canvas.Invalidate();
}
}
private void canvas_MouseUp(object sender,MouseEventArgs e)
{
i++;
}
private void canvas_Paint(object sender,PaintEventArgs e)
{
artManager.Draw(e,actions);
e.Graphics.SmoothingMode = System.Drawing.drawing2d.SmoothingMode.AntiAlias;
}
我为 HandDraw(自由形式的线)得到的结果不是我所期望的......曲线有刺。笔宽越小,问题越小,但数字越大,问题越严重:Image1,Image2 当画布上有很多东西时,问题会变得更糟。
有关如何解决此问题的任何建议?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)