You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PictureBox绘制交通灯颜色异常:所有圆圈仅填充绿色求助

解决PictureBox交通灯颜色全部显示绿色的问题

咱们先从最常见的出错点入手排查,再给你修正后的代码参考:

可能的核心原因

  • 填充圆圈时重复引用了同一个SolidBrush数组元素(比如三个圆圈都用了brushes[2]——也就是绿色的那个)
  • SolidBrush数组初始化有误,比如三个元素都被误设置成了绿色
  • 没有正确计算每个圆圈的Y轴位置,导致后面的绿色圆圈覆盖了前面的(不过你说都显示绿色,这个可能性相对低,但也可以留意)

修正后的完整代码示例

我标注了关键修改点,你可以直接参考:

private void btnDrawTLight_Click(object sender, EventArgs e)
{
    try
    {
        int circleSize = int.Parse(txtRadius.Text) * 2;
        // 用using包裹GDI+对象,自动释放资源,避免内存泄漏
        using (Graphics paper = ptbDiplay.CreateGraphics())
        using (Pen pen1 = new Pen(Color.Black, 2))
        {
            // 正确初始化交通灯颜色数组:红、黄、绿对应索引0、1、2
            SolidBrush[] brushes = new SolidBrush[]
            {
                new SolidBrush(Color.Red),
                new SolidBrush(Color.Yellow),
                new SolidBrush(Color.Green)
            };

            // 计算起始位置,让交通灯在PictureBox里居中显示
            int startX = (ptbDiplay.Width - circleSize) / 2;
            int startY = (ptbDiplay.Height - circleSize * 3 - 20) / 2; // 预留圆圈间的间距

            // 绘制红色圆圈(对应数组索引0)
            paper.DrawEllipse(pen1, startX, startY, circleSize, circleSize);
            paper.FillEllipse(brushes[0], startX, startY, circleSize, circleSize);

            // 绘制黄色圆圈(对应数组索引1),Y轴偏移一个圆圈高度加间距
            int yellowY = startY + circleSize + 10;
            paper.DrawEllipse(pen1, startX, yellowY, circleSize, circleSize);
            paper.FillEllipse(brushes[1], startX, yellowY, circleSize, circleSize);

            // 绘制绿色圆圈(对应数组索引2),继续偏移
            int greenY = yellowY + circleSize + 10;
            paper.DrawEllipse(pen1, startX, greenY, circleSize, circleSize);
            paper.FillEllipse(brushes[2], startX, greenY, circleSize, circleSize);

            // 手动释放数组里的Brush资源
            foreach (var brush in brushes)
            {
                brush.Dispose();
            }
        }
    }
    catch (FormatException)
    {
        MessageBox.Show("请输入有效的半径数值!");
    }
    catch (Exception ex)
    {
        MessageBox.Show($"绘制出错:{ex.Message}");
    }
}

关键注意事项

  • 索引对应要准确:这是最容易踩坑的地方!确保第一个圆圈用brushes[0](红色),第二个用brushes[1](黄色),第三个用brushes[2](绿色)
  • 资源必须释放:GDI+对象(Graphics、Pen、Brush)占用系统资源,用using包裹可以自动释放,避免内存泄漏
  • 持久化绘制建议:如果用CreateGraphics绘制,PictureBox刷新(比如窗口最小化再还原)后内容会消失。想要持久显示,建议重写PictureBox的OnPaint方法,在里面完成绘制逻辑

额外优化:交通灯切换效果

如果想实现动态切换亮灯的效果,可以添加一个全局变量记录当前亮灯状态,绘制时只填充对应颜色,其他用灰色:

// 全局变量记录当前亮灯索引:0=红,1=黄,2=绿
private int currentLight = 0;

// 修改绘制逻辑
for (int i = 0; i < 3; i++)
{
    int yPos = startY + i * (circleSize + 10);
    paper.DrawEllipse(pen1, startX, yPos, circleSize, circleSize);
    // 当前亮灯用对应颜色,其他填充灰色
    Color fillColor = i == currentLight ? new Color[] { Color.Red, Color.Yellow, Color.Green }[i] : Color.Gray;
    using (SolidBrush brush = new SolidBrush(fillColor))
    {
        paper.FillEllipse(brush, startX, yPos, circleSize, circleSize);
    }
}

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:00:21