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
相关产品推荐
相关产品推荐

