Winforms:从不同的类调用入口窗体函数

本文关键字:调用 入口 窗体 函数 Winforms | 更新日期: 2023-09-27 18:28:07

我对编程有点陌生,有一个问题是什么是好的实践。

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

我知道在Winforms中,每次你想重新绘制屏幕或部分屏幕时,都必须调用Invalidate()。我没有找到好的方法来做到这一点,所以我在课堂上引用了这个表单,每次我需要重新绘制到球的运动时,都在我的ball类中调用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
    }
}

我想知道有没有更好的方法?

(对不起我的英语)

Winforms:从不同的类调用入口窗体函数

您应该在球中创建一个Changed事件,每当需要重新绘制球时,该事件就会触发
然后,您可以在表单和Invalidate()中处理此事件。

但是,最好将所有计时器替换为单个计时器,该计时器在每个对象(球、砖等)中调用公共Tick()方法
然后,在勾选每个对象之后,可以执行单个Invalidate()
这样还可以确保所有对象都处于同步状态。