我正在编写的这个小程序的目标是在选中 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++;
}
}
}
最佳答案
图形在 Windows 窗体中的工作方式是,Paint 方法重绘整个面板。
您已经在每次执行 paint 方法时绘制每个点:这是正确的。
但是您无法记住哪个点应该是哪种颜色,因此在绘画时您需要继续的就是单选按钮的当前值。添加圆圈时,您需要某种方式来记录当前颜色。
一种方法是定义一个 Circle 类来存储圆的位置和颜色:
class Circle
{
public Point Location { get; set; }
public Brush Fill { get; set; }
}
然后代替 points
作为List<Point>
, 它可以是 List<Circle>
, 当您看到鼠标单击时,您可以添加一个新的 Circle
而不是 Point
:
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);
}
请注意,您不需要成员(member)级别 Graphics g
- 保留 Graphics
是个坏主意Paint
之后的对象方法已经完成。它不一定以后仍然有效。始终只使用 e.Graphics
.
我也替换了你的while
使用更简单的循环 foreach
.
关于c# - 如何将两个色圈保持在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36925551/