C#油漆应用

C#油漆应用,c#,winforms,C#,Winforms,我用c#制作了一个简单的绘画程序,可以在面板上绘制,但是每当我改变画笔的颜色时,所有其他线条也会改变为该颜色。因此,如果我用黑色绘制3条线,然后用colorDialog将颜色更改为红色并绘制另一条线,则旧的线也会更改为红色。我想要的是线条保持原来的颜色。这是我的密码: public partial class Form3 : Form { List<Point> points = new List<Point>(); Point current = n

我用c#制作了一个简单的绘画程序,可以在面板上绘制,但是每当我改变画笔的颜色时,所有其他线条也会改变为该颜色。因此,如果我用黑色绘制3条线,然后用colorDialog将颜色更改为红色并绘制另一条线,则旧的线也会更改为红色。我想要的是线条保持原来的颜色。这是我的密码:

 public partial class Form3 : Form
{
    List<Point> points = new List<Point>();
     Point current = new Point();
     Point old = new Point();
    List<List<Point>> curves = new List<List<Point>>();
    Pen p = new Pen(Color.Black, 5f);
     Graphics g;
    Bitmap surface;
    Graphics graph;
    Color color;

    public Form3()
    {
        InitializeComponent();
        g = panel1.CreateGraphics();
        p.SetLineCap(System.Drawing.Drawing2D.LineCap.Round, System.Drawing.Drawing2D.LineCap.Round, System.Drawing.Drawing2D.DashCap.Round);
        surface = new Bitmap(panel1.Width, panel1.Height);
        graph = Graphics.FromImage(surface);
        panel1.BackgroundImage = Image.FromFile(@"C:\Users\PC\Pictures\Saved Pictures\download.jpg");
        panel1.BackgroundImageLayout = ImageLayout.Stretch;
    }

    private void panel1_MouseDown(object sender, MouseEventArgs e)
    {
        old = e.Location;
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Left)
        {
            
            points.Add(e.Location);
           
            current = e.Location;
            g.DrawLine(p, old, current);
            old = current;
        }
    }

    private void undo_Click(object sender, EventArgs e)
    {
        curves.RemoveAt(curves.Count - 1);
        panel1.Invalidate();
       
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
       
        for(int i = 0; i<curves.Count; i++)
        {
            
            e.Graphics.DrawCurve(p, curves[i].ToArray());
        }
    }

    private void panel1_MouseUp(object sender, MouseEventArgs e)
    {
        if (points.Count > 1) curves.Add(points.ToList());
        
        points.Clear();
        //panel1.Invalidate();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        if (colorDialog1.ShowDialog() == DialogResult.OK)
        {
            color = colorDialog1.Color;
            p = new Pen(color, 5f);
        }
    }
}
公共部分类表单3:表单
{
列表点=新列表();
点电流=新点();
旧点=新点();
列表曲线=新列表();
笔p=新笔(颜色为黑色,5f);
图形g;
位图表面;
图形;
颜色;
公共表格3()
{
初始化组件();
g=panel1.CreateGraphics();
p、 设置LineCap(System.Drawing.Drawing2D.LineCap.Round、System.Drawing.Drawing2D.LineCap.Round、System.Drawing.Drawing2D.DashCap.Round);
表面=新位图(panel1.Width,panel1.Height);
graph=Graphics.FromImage(曲面);
panel1.BackgroundImage=Image.FromFile(@“C:\Users\PC\Pictures\Saved Pictures\download.jpg”);
panel1.BackgroundImageLayout=ImageLayout.Stretch;
}
专用无效面板1\u鼠标向下(对象发送方,鼠标目标e)
{
old=e.位置;
}
专用无效面板1u MouseMove(对象发送器,MouseEventArgs e)
{
if(e.Button==MouseButtons.Left)
{
添加点(如位置);
当前=e.位置;
g、 抽绳(p,旧,当前);
旧=当前;
}
}
私有无效撤消\单击(对象发送方,事件参数e)
{
curves.RemoveAt(curves.Count-1);
1.使无效();
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
对于(inti=0;i1)曲线,添加(points.ToList());
点。清除();
//1.使无效();
}
私有无效按钮2\u单击(对象发送者,事件参数e)
{
if(colorDialog1.ShowDialog()==DialogResult.OK)
{
颜色=颜色对话框1.颜色;
p=新笔(颜色,5f);
}
}
}

谢谢大家的帮助。我解决了这个问题,创建了一个包含点和笔的类,然后每次绘制一条线时都创建该类的一个对象,之后在paint函数中,它会遍历对象列表,并用相应的颜色重新绘制每一条线。

在各种错误中,您只有一支笔,
p
用于绘制所有内容。因为一次只能有一种颜色…请删除以下内容:
g=panel1.CreateGraphics()和所有其他您从未使用过的东西(如
graph=Graphics.FromImage(surface);
)。在画布的绘制事件中进行所有绘制(可能使用PictureBox作为绘制表面)。然后,必须将图形存储在描述图形的类对象集合中。要使用的笔的颜色是这些细节中的一个(如笔的大小、形状、画笔、是否填充形状等)。如果你想为每个形状使用特定的笔、画笔等,这是一个很好的多态性的机会,拥有一个通用的形状类,它有一个抽象的DrawYourSelf-OnIsCanvas方法,具体实现不同的三角形和矩形…你需要存储的不仅仅是点。由于钢笔有颜色,但也有很多其他的功能,比如宽度和一些,你可以创建一个更复杂的类型,称为maybe
DrawAction
,或者创建一个字典,将你需要的所有钢笔存储在那里,并添加一个
列表penIndices
-对这个话题有更多评论的两个。。