C# 如何制作更好的线条?

C# 如何制作更好的线条?,c#,winforms,graphics,drawing,C#,Winforms,Graphics,Drawing,因此,我在C#中制作了一个绘画应用程序,它的工作原理是当用户单击绘画面板时标记一个点,然后当用户将鼠标移动到新位置时,让他/她的鼠标向下绘制一条线;我在学C#,所以它很基础。现在一切都很好,直到我把笔调大,当我这样做的时候,线条开始看起来非常奇怪?有人知道任何可能的解决方案,使线路看起来正常吗 这是我的代码,我正在使用windows窗体应用程序: using System; using System.Collections.Generic; using System.ComponentMode

因此,我在C#中制作了一个绘画应用程序,它的工作原理是当用户单击绘画面板时标记一个点,然后当用户将鼠标移动到新位置时,让他/她的鼠标向下绘制一条线;我在学C#,所以它很基础。现在一切都很好,直到我把笔调大,当我这样做的时候,线条开始看起来非常奇怪?有人知道任何可能的解决方案,使线路看起来正常吗

这是我的代码,我正在使用windows窗体应用程序:

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;
using Microsoft.VisualBasic;
using System.Drawing.Drawing2D;

namespace paintApplication
{

    public partial class frmPaintApp : Form
    {
        /// <summary>
        /// variables
        /// </summary>
        bool shouldPaint = false;
        Point prePoint;
        float penSize = 1;
        Graphics g;

        ColorDialog cd = new ColorDialog();

        public frmPaintApp()
        {
            InitializeComponent();
            g = pnlPaintPanel.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;
        }

        private void msPensize_Click(object sender, EventArgs e)
        {

            if (float.TryParse(msTxtchoosesize.Text , out penSize))
            {
                msTxtchoosesize.Text = "";
            }
        }

        private void pnlPaintPanel_MouseDown(object sender, MouseEventArgs e)
        {
            shouldPaint = true;
            prePoint = new Point(e.X, e.Y);
        }

        private void pnlPaintPanel_MouseUp(object sender, MouseEventArgs e)
        {
            shouldPaint = false;
        }

        private void pnlPaintPanel_MouseMove(object sender, MouseEventArgs e)
        {
            Pen p = new Pen(cd.Color, penSize);


            if (shouldPaint == true)
            {
                g.DrawLine(p, prePoint, new Point(e.X, e.Y));
            }

            prePoint = new Point(e.X, e.Y);

        }

        private void msChoosecolor_Click(object sender, EventArgs e)
        {
            cd.ShowDialog();
        }

        private void frmPaintApp_ResizeEnd(object sender, EventArgs e)
        {
            g = pnlPaintPanel.CreateGraphics();
            g.SmoothingMode = SmoothingMode.AntiAlias;
        }

        private void msClear_Click(object sender, EventArgs e)
        {
            g.Clear(pnlPaintPanel.BackColor);

        }

        private void msExit_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void pnlPaintPanel_Paint(object sender, PaintEventArgs e)
        {

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用Microsoft.VisualBasic;
使用System.Drawing.Drawing2D;
命名空间应用程序
{
公共部分类FRMPainApp:表单
{
/// 
///变数
/// 
bool shoulpaint=false;
点介词;
浮动养老金=1;
图形g;
ColorDialog cd=新建ColorDialog();
公共frmPaintApp()
{
初始化组件();
g=pnlPaintPanel.CreateGraphics();
g、 SmoothingMode=SmoothingMode.AntiAlias;
}
私有void msPensize_单击(对象发送方,事件参数e)
{
if(float.TryParse(mstxchoosesize.Text,out-penSize))
{
mstxtschoosesize.Text=“”;
}
}
私有void pnlPaintPanel_MouseDown(对象发送方,MouseEventArgs e)
{
shoulpaint=正确;
prePoint=新点(e.X,e.Y);
}
私有void pnlPaintPanel_MouseUp(对象发送方,MouseEventArgs e)
{
shoulpaint=假;
}
私有void pnlPaintPanel_MouseMove(对象发送方,MouseEventArgs e)
{
笔p=新笔(cd.Color,Penize);
if(shouldPaint==true)
{
g、 抽绳(p,前置点,新点(e.X,e.Y));
}
prePoint=新点(e.X,e.Y);
}
私有void msChoosecolor\u单击(对象发送者,事件参数e)
{
ShowDialog();
}
私有void frmPaintApp_ResizeEnd(对象发送方,事件参数e)
{
g=pnlPaintPanel.CreateGraphics();
g、 SmoothingMode=SmoothingMode.AntiAlias;
}
私有void msClear\u单击(对象发送方,事件参数e)
{
g、 清晰(pnlPaintPanel.BackColor);
}
私有void msExit_单击(对象发送方,事件参数e)
{
这个。关闭();
}
私有void pnlPaintPanel_Paint(对象发送器,PaintEventArgs e)
{
}
}
}

除了我关于使用CreateGraphics等的评论外,请尝试更改您的行头(并处理掉您的笔,因为您正在泄漏内存):


画圆圈而不是线会有帮助。永远不要存储图形对象-这是暂时的。永远不要使用CreateGraphics。使用面板的“绘制”事件绘制所有线条,或使用位图并在“绘制”事件中显示。“你想用45号的钢笔吗?”Carcigenicate同意了。可以将圆的大小绑定到绘图程序中“笔”的大小。在绘制圆的可变尺寸“笔”上进行实心填充应该完全符合要求。为什么不使用GraphicsPath创建路径并将线条连接设置为圆形
using (Pen p = new Pen(Color.Black, penSize)) {
  p.StartCap = LineCap.Round;
  p.EndCap = LineCap.Round;
  if (shouldPaint) {
    g.DrawLine(p, prePoint, new Point(e.X, e.Y));
  }
}