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

C# WinForms:PictureBox中移动双球仅显示一个的问题求助

问题根源与修复方案

核心问题

你遇到的问题是每个Ball的paintBall方法里都调用了e.Graphics.Clear()。当遍历绘制两个球时:

  • 第一个球绘制完成后,第二个球的Clear()会直接清空整个PictureBox的画布,把第一个球的绘制结果完全覆盖
  • 最终只有最后一个被遍历到的球会留在画布上

修复步骤

  1. 将画布清空操作移到遍历绘制之前,只执行一次
    把Clear()和抗锯齿设置从Ball的绘制方法中抽出来,统一在PictureBox的Paint事件开头处理,避免重复清空。
  2. 修改Ball类的绘制方法,只保留绘制椭圆的逻辑

修改后的代码示例

PictureBox的Paint事件处理代码

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    // 统一清空画布,只执行一次
    e.Graphics.Clear(pictureBox1.BackColor);
    // 统一设置抗锯齿,避免重复配置
    e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

    // 遍历绘制所有球
    foreach(Ball b in balls)
    {
        b.paintBall(e, pictureBox1);
    }
}

修改后的Ball类paintBall方法

public void paintBall(PaintEventArgs e, PictureBox myPictureBox)
{
    // 移除Clear和抗锯齿设置,只负责绘制当前球
    e.Graphics.FillEllipse(farbe, ballPosX, ballPosY, ballWidth, ballHeight);
    e.Graphics.DrawEllipse(Pens.Black, ballPosX, ballPosY, ballWidth, ballWidth);
}

额外提示

注意你Ball类的moveBall方法里有个拼写错误:ballHeigth应该是ballHeight,虽然不影响当前显示问题,但后续可能导致碰撞检测逻辑出错,建议修正。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:57:21