如何绘制圆圈并在c#中移动

时间:2014-09-20 20:00:51

标签: c# geometry

我正在尝试绘制一个圆圈并在c#中以一种形式移动它。我使用GDI绘制,如下所示。 假设我有1个圆圈

int postitionX, postitionY, radius, angle;
void Draw(Graphics g)
{
    g.DrawEllipse(Pen, postitionX, postitionY, radius, radius);
    g.FillEllipse(SolidBrush, postitionX, postitionY, radius, radius);
}

并且在主要形式I init圈(postitionX = 0,postitionY = 10,radius = 20,angle = 30;)

private void form_Paint(object sender, PaintEventArgs e)
{
     <caculation postition next>
    mycircle.Draw(e.Graphics)
}

但问题是函数form_Paint运行多次并使圆圈移出显示。 有人能给我解决方案吗?

2 个答案:

答案 0 :(得分:3)

Invalidate会对您的表单进行完整重绘,并会调用您的`form_Paint&#39;事件处理程序这将导致无限循环。 (我现在看到TaW就在前面)。 如果要在表单上设置圆形动画,可以使用以下方法:

在表单上放置Timer,将Interval设置为30,将Enabled设置为True。实施Tick事件:

private int deltaX = 1;

private int deltaY = 1;

private void timer1_Tick(object sender, EventArgs e)
{ 
    // TO DO your caculation postition, like so:
    // be sure window width/height  is much larger than 2 * radius:           
    if ((postitionX - radius) <= 0)
        deltaX = 1;
    if ((postitionX + radius) >= ClientRectangle.Width)
        deltaX = -1;
    positionX += deltaX;

    if ((postitionY - radius) <= 0)
        deltaY = 1;
    if ((postitionY + radius) >= ClientRectangle.Heigth)
        deltaY = -1;
    positionY += deltaY;
    // Now you have calculated a 'new animation frame'. 

    // Now force repaint to draw.
    Invalidate(); // This will force a repaint
}

现在更新你的form_Paint处理程序:

private void form_Paint(object sender, PaintEventArgs e)
{
    // caculation postition next HAS TO BE REMOVED FROM HERE
    mycircle.Draw(e.Graphics)
    // Invalidate(); HAS TO BE REMOVED FROM HERE
}

通过将timer1.Interval的valye与下一个位置的计算结合使用,可以使动画更慢或更快。

答案 1 :(得分:0)

所以假设我画圆圈的路径为3分。如果我使用计时器滴答,那么如何。

private void timer1_Tick(object sender, EventArgs e)
{
// Go to point 1  
// Go to point 2 
// Go to point 3
}
private void form_Paint(object sender, PaintEventArgs e)
{
    // caculation postition next HAS TO BE REMOVED FROM HERE
    mycircle.Draw(e.Graphics)
    // Invalidate(); HAS TO BE REMOVED FROM HERE
}

所以圈子将经过第3点然后form_main开始重绘。我不想要那样。那你怎么不能