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