Использование метода рисования для создания движения на форме - не работает - PullRequest
0 голосов
/ 25 февраля 2020

Я пытаюсь нарисовать движущийся прямоугольник и окружность на форме, используя метод рисования. Кнопка должна начать процесс. 2-е нажатие должно завершить программу. Переменная Once является глобальным логическим значением, установленным на True при запуске. X1 - это глобальное целое число, установленное на 10 при запуске. Up является глобальным логическим значением, установленным в true при запуске.

На каждой итерации переменная X1 увеличивается до 100, спускаясь до 10, бесконечно.

Я наблюдаю две проблемы следующим образом.

  1. Нет движения чертежа в форме
  2. Нет контроля в форме после запуска программы

Ниже приведен код:

private void Form1_Paint(object sender, PaintEventArgs e)  
{  

    Pen red = new Pen(Color.Red,3);  
    Rectangle rect = new Rectangle(x1, x1, x1, x1);  
    Rectangle circle = new Rectangle(x1+10, x1 + 10, x1 + 50, x1 + 50);  

    //Graphics g = e.Graphics;  
    Graphics g = CreateGraphics();  
    g.DrawRectangle(red,rect);  
    g.DrawEllipse(red, circle);  

    red.Dispose();  
    g.Dispose();             
}  

private void button2_Click(object sender, EventArgs e)  
{            
    if (once)             
        once = false;              
    else  
        Environment.Exit(0);  

    while (true)  
    {  
        if (up )  
        {  
            x1 += 10;  
            if (x1 > 100)  
                up = false;  
        }  
        else  
        {  
            x1 -= 10;  
            if (x1 <= 10)  
                up = true;  
        }  
        this.Invalidate();  
        Thread.Sleep(500);  
    }                      
}  

1 Ответ

0 голосов
/ 25 февраля 2020

Вот один из способов решения этой задачи с использованием System.Windows.Forms.Timer, см. Изменения и комментарии:

private int x1 = 4;
System.Windows.Forms.Timer timer;
private bool once = true;
private bool up = false;
private void Form1_Paint(object sender, PaintEventArgs e)
{
    // use e.Graphics
    Graphics g = e.Graphics;
    Pen red = new Pen(Color.Red, 3);
    Rectangle rect = new Rectangle(x1, x1, x1, x1);
    Rectangle circle = new Rectangle(x1 + 10, x1 + 10, x1 + 50, x1 + 50);
    g.DrawRectangle(red, rect);
    g.DrawEllipse(red, circle);

    red.Dispose();
    g.Dispose();
}

private void button2_Click(object sender, EventArgs e)
{
    if (once)
    {
        once = false;
        Init();
    }
    else
    {
        if (timer != null)
        {
            timer.Stop();
            timer.Dispose();
            timer = null;
        }
        // you can exit app...
         Application.Exit();
    }
}

private void Init()
{
    if (timer == null)
    {
        timer = new Timer();
        timer.Interval = 500;
        timer.Tick += timer_tick;
    }

    timer.Start();
}

private void timer_tick(object sender, EventArgs e)
{
    if (up)
    {
        x1 += 10;
        if (x1 > 100)
            up = false;
    }
    else
    {
        x1 -= 10;
        if (x1 <= 10)
            up = true;
    }
    this.Invalidate();
}
...