C# 如何将两种颜色的圆圈保持在一起

C# 如何将两种颜色的圆圈保持在一起,c#,winforms,graphics,C#,Winforms,Graphics,我正在做的这个小程序的目标是在选中radiobutton1时画一个红色圆圈,在选中radiobutton2时画一个黑色圆圈 下面是我的代码,这个代码的问题是当选中radiobutton1时,它会画红色的圆圈,但是如果我点击radiobutton2,那么所有的红色圆圈都会变成黑色。然后,如果再次检查radiobutton1,则所有点将再次变为红色 如何在面板上保持两个颜色圈 List<Point> points = new List<Point>(); Graphics

我正在做的这个小程序的目标是在选中radiobutton1时画一个红色圆圈,在选中radiobutton2时画一个黑色圆圈

下面是我的代码,这个代码的问题是当选中radiobutton1时,它会画红色的圆圈,但是如果我点击radiobutton2,那么所有的红色圆圈都会变成黑色。然后,如果再次检查radiobutton1,则所有点将再次变为红色

如何在面板上保持两个颜色圈

List<Point> points = new List<Point>();

Graphics g;
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
   points.Add(e.Location);
   panel1.Invalidate();
}

private void panel1_Paint(object sender, PaintEventArgs e)
{
    int count = 0;
    if (radioButton1.Checked)
    {
        g = e.Graphics;
        while (count < points.Count())
        {
            g.FillEllipse(Brushes.Red, points[count].X, points[count].Y, 10, 10);
            count++;
        }
    }
    else if (radioButton2.Checked)
    {
        g = e.Graphics;
        while (count < points.Count())
        {
            g.FillEllipse(Brushes.Black, points[count].X, points[count].Y, 10, 10);
            count++;
        }
    }
}
列表点=新列表();
图形g;
专用无效面板1\u鼠标向下(对象发送方,鼠标目标e)
{
添加点(如位置);
1.使无效();
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
整数计数=0;
如果(radioButton1.选中)
{
g=e.图形;
while(count
如果我正确理解您的意图,您需要保留两个点列表,每个点对应一种颜色。然后,当您单击某个位置时,将单击的点放在相应的列表中(红色或黑色)。然后,在
Paint
事件处理程序中,将条件代码替换为两个循环,每个循环一个通过点列表(将红色列表中的点绘制为红色,将黑色列表中的点绘制为黑色)

代码:

List redPoints=new List();
列表黑点=新列表();
专用无效面板1\u鼠标向下(对象发送方,鼠标目标e)
{
如果(radioButton1.选中)
红点。添加(如位置);
其他的
黑点。添加(如位置);
1.使无效();
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
整数计数=0;
图形g=e.图形;
foreach(红色点中的点p)
{
g、 填充椭圆(红色,p.X,p.Y,10,10);
}
foreach(黑点中的点p)
{
g、 填充椭圆(黑色,p.X,p.Y,10,10);
}
}

注意:如果您的圆彼此重叠,并且您关心保持分层顺序(首先单击圆,然后绘制),那么@Blorgbeard的解决方案更好,因为它将所有圆保持在同一列表中,从而保持原始分层。请随意切换已接受的答案。

如果我正确理解您的意图,您需要保留两个点列表,每种颜色一个点。然后,当您单击某个位置时,将单击的点放在相应的列表中(红色或黑色)。然后,在
Paint
事件处理程序中,将条件代码替换为两个循环,每个循环一个通过点列表(将红色列表中的点绘制为红色,将黑色列表中的点绘制为黑色)

代码:

List redPoints=new List();
列表黑点=新列表();
专用无效面板1\u鼠标向下(对象发送方,鼠标目标e)
{
如果(radioButton1.选中)
红点。添加(如位置);
其他的
黑点。添加(如位置);
1.使无效();
}
私有void panel 1_Paint(对象发送器,PaintEventArgs e)
{
整数计数=0;
图形g=e.图形;
foreach(红色点中的点p)
{
g、 填充椭圆(红色,p.X,p.Y,10,10);
}
foreach(黑点中的点p)
{
g、 填充椭圆(黑色,p.X,p.Y,10,10);
}
}

注意:如果您的圆彼此重叠,并且您关心保持分层顺序(首先单击圆,然后绘制),那么@Blorgbeard的解决方案更好,因为它将所有圆保持在同一列表中,从而保持原始分层。请随意切换已接受的答案。

图形在Windows窗体中的工作方式是,绘制方法会重新绘制整个面板

您已经在每次执行绘制方法时绘制每个点:这是正确的

但是你无法记住哪一点应该是哪一种颜色,所以当你画的时候,你需要做的就是单选按钮的当前值。添加圆时,需要某种方法记录当前颜色

一种方法是定义一个Circle类,该类存储圆的位置和颜色:

class Circle
{
    public Point Location { get; set; }
    public Brush Fill { get; set; }
}
然后,它可以是一个
列表,而不是
,当您看到鼠标单击时,您可以添加一个新的
,而不是

var circle = new Circle()
{
    Location = e.Location,
    Fill = radioButton1.Checked ? Brushes.Red : Brushes.Black
};
points.Add(circle);
当你画的时候,你可以在画的时候检查每个圆圈的颜色——你所要做的就是:

foreach (var circle in points)
{
    e.Graphics.FillEllipse(circle.Fill, circle.Location.X, circle.Location.Y, 10, 10);
}
请注意,您不需要成员级别的
Graphics g
——在
Paint
方法完成后保留
Graphics
对象是个坏主意。它不一定在以后仍然有效。始终只使用
e.Graphics


我还将
while
循环替换为更简单的
foreach

图形在Windows窗体中的工作方式是,绘制方法重新绘制整个面板

您已经在每次执行绘制方法时绘制每个点:这是正确的

但是你无法记住哪一点应该是哪一种颜色,所以当你画的时候,你需要做的就是单选按钮的当前值。添加圆时,需要某种方法记录当前颜色

一种方法是定义一个Circle类,该类存储圆的位置和颜色:

class Circle
{
    public Point Location { get; set; }
    public Brush Fill { get; set; }
}
然后,它可以是一个
列表,而不是
,当您看到鼠标单击时,您可以添加一个新的
,而不是

var circle = new Circle()
{
    Location = e.Location,
    Fill = radioButton1.Checked ? Brushes.Red : Brushes.Black
};
points.Add(circle);
当你画的时候,你可以在画的时候检查每个圆圈的颜色——你所要做的就是:

foreach (var circle in points)
{
    e.Graphics.FillEllipse(circle.Fill, circle.Location.X, circle.Location.Y, 10, 10);
}