Winforms:从不同的类调用entry表单函数

时间:2012-03-18 16:51:17

标签: c# winforms coding-style

我对编程很陌生,并对什么是好的做法有疑问。

我创建了一个代表球的类,它有一个函数Jump(),使用2个定时器并上下球。

我知道在Winforms中,每次要重新绘制屏幕或部分屏幕时都需要调用Invalidate()。我没有找到一个很好的方法来做到这一点,所以我在课堂上引用了这个表格,并且每当我需要重新绘制球运动时,在我的球类中调用Invalidate()

(这有效,但我觉得这不是一个好习惯)

这是我创建的课程:

public class Ball
{
    public Form1 parent;//----> here is the reference to the form
    public Rectangle ball;
    Size size;
    public  Point p;
    Timer timerBallGoUp  = new Timer();
    Timer timerBallGDown = new Timer();

    public  int ballY;

    public Ball(Size _size, Point _p)
    {
        size = _size;
        p = _p;
        ball = new Rectangle(p, size);
    }

    public void Jump()
    {
        ballY = p.Y;
        timerBallGDown.Elapsed += ballGoDown;
        timerBallGDown.Interval = 50;
        timerBallGoUp.Elapsed += ballGoUp;
        timerBallGoUp.Interval = 50;
        timerBallGoUp.Start();
    }

    private void ballGoUp(object obj,ElapsedEventArgs e)
    {
        p.Y++;
        ball.Location = new Point(ball.Location.X, p.Y);
        if (p.Y >= ballY + 50)
        {
            timerBallGoUp.Stop();
            timerBallGDown.Start();
        }

        parent.Invalidate(); // here i call parent.Invalidate() 1
    }

    private void ballGoDown(object obj, ElapsedEventArgs e)
    {
        p.Y--;
        ball.Location = new Point(ball.Location.X, p.Y);

        if (p.Y <= ballY)
        {
            timerBallGDown.Stop();
            timerBallGoUp.Start();
        }

        parent.Invalidate(); // here i call parent.Invalidate() 2
    }
}

如果有更好的方法可以做到这一点,我很想知道吗?

(对不起我的英文)

1 个答案:

答案 0 :(得分:3)

当球需要重新绘制时,你应该在球中发出Changed事件。 然后,您可以在表单Invalidate()

中处理此事件

但是,最好使用单个计时器替换所有计时器,并在每个对象(球,砖等)中调用公共Tick()方法。
然后,您可以在勾选每个对象后执行单个Invalidate() 这也确保了所有对象都是同步的。