Windows 窗体中的自由格式行问题

问题描述

最近我正在开发 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 (将#修改为@)