C# 如何处理图形。Clear()用于一个图形,而不用于同一图像中的另一个图形

C# 如何处理图形。Clear()用于一个图形,而不用于同一图像中的另一个图形,c#,C#,我面临一个表单图形的问题,因为这是我的第一个项目。我会尽量简化我的问题 我有一个代码,其中,1。较小的圆围绕较大的(//动画1)和2旋转。绘制矩形以形成波浪线(//动画2) while(true) { //发行行 g、 清晰(颜色:白色); g、 抽屉(钢笔、主圆圈); loc=下一个点(半径、角度、中心圆); innerCircle.X=loc.X-(innerCircle.Width/2)+mainCircle.X; innerCircle.Y=loc.Y-(innerCircle.Heig

我面临一个表单图形的问题,因为这是我的第一个项目。我会尽量简化我的问题

我有一个代码,其中,1。较小的圆围绕较大的(
//动画1
)和2旋转。绘制矩形以形成波浪线(
//动画2

while(true)
{
//发行行
g、 清晰(颜色:白色);
g、 抽屉(钢笔、主圆圈);
loc=下一个点(半径、角度、中心圆);
innerCircle.X=loc.X-(innerCircle.Width/2)+mainCircle.X;
innerCircle.Y=loc.Y-(innerCircle.Height/2)+mainCircle.Y;
//动画1
g、 抽屉(钢笔、内圈);
//动画2
g、 抽绳(画笔,cntr_mainCircle.X+30,cntr_mainCircle.Y+30,innerCircle.X+innerCircle_lenX/2,innerCircle.Y+innerCircle_lenY/2);
g、 圆角矩形(画笔.Red,startIndex,内圆.Y+25,3,3);
fg.DrawImage(btm,新点F(20,20));
如果(角度<360)
{
角度+=1.0f;
}
其他的
{
角度=0;
}
startIndex++;
}
我的线条
g.Clear(Color.White)有问题。它会清除整个屏幕,但我的要求是清除
//动画1
,而不是清除
//动画2

上面的代码给出下面的输出。圆圈动画如预期的那样正确,但是如果您看到。。有一个红色的小矩形,它的动画像波浪。。但是由于Clear()的作用,波被擦除了。

我需要一个如下所示的波形。(下面的输出是当我删除
//Issue line
或say Clear()函数时的输出)

我的预期输出如下,即圆形动画(//animation 1)正在清除屏幕,而正在执行运动动画和波动动画(//animation 2),不应清除以前绘制的矩形


我需要修改代码的建议,如果当前代码不符合标准,我甚至愿意接受应用新方法的建议。

此代码没有一点错误。永远不要使用while(true)循环挂起UI线程,永远不要使用CreateGraphics()。您需要使用Paint事件(计时器)来设置动画。其勾号事件应调用Invalidate()以强制重新绘制。@HansPassant您好,谢谢您的建议,但使用您提到的方法。。我能解决这个问题吗?我可以运行两个单独的标记器,并保持每个动画的图形配置独立吗?@Jimi运行旋转代码没有任何问题,它工作正常。:)这与旋转本身无关,而是与
图形
对象的使用有关的整体渲染方式。我链接了该代码,因为执行了类似的操作。另外,如前所述,在WinForms中绘制时不使用
while(true)
,而是使用
Paint
事件的
PaintEventArgs
对象和
Invalidate()
画布(正在绘制的控件)。
    while (true)
        {
            // Issue line
            g.Clear(Color.White);

            g.DrawEllipse(pen, mainCircle);
            loc = nextPoint(radius, angle, cntr_mainCircle);

            innerCircle.X = loc.X - (innerCircle.Width / 2) + mainCircle.X;
            innerCircle.Y = loc.Y - (innerCircle.Height / 2) + mainCircle.Y;

            //Animation 1
            g.DrawEllipse(pen, innerCircle);
            //Animation 2
            g.DrawLine(pen, cntr_mainCircle.X + 30, cntr_mainCircle.Y + 30, innerCircle.X + innerCircle_lenX / 2, innerCircle.Y + innerCircle_lenY / 2);

            g.FillRectangle(Brushes.Red, startIndex, innerCircle.Y + 25, 3, 3);

            fg.DrawImage(btm, new PointF(20, 20));

            if (angle < 360)
            {
                angle += 1.0f;
            }
            else
            {
                angle = 0;
            }

            startIndex++;
        }