c# - 如何将两个色圈保持在一起

标签 c# winforms 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++;
        }
    }
}

最佳答案

图形在 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/

相关文章:

c# - 组合框显示成员问题,快把我逼疯了

javascript - 如何扩大光华的半径?

Java 使用 Graphics 创建动态但简单的图形

C# - 用分号替换换行符

c# - 共享文件夹API

c# - C# 中的 ProductName 和 CompanyName

c# - 从 Windows 系统写入具有 Samba 服务器的 Linux 系统中存在的文件

c - 在 C/C++ 中获取图像?

c# - GridView导出Excel时如何隐藏到列?

c# - 可以使用 Boost 或 STL 显示自定义字符串的 C++ 断言?