Перемещение объекта с событием Paint

У меня завтра тест, и мы должны использовать событие рисования для перерисовки наших объектов, мы не можем использовать таймер.

Как говорит MSDN: «Событие Paint возникает, когда элемент управления перерисовывается»., но это, насколько мне известно, происходит только тогда, когда форма свернута или стала невидимой и снова видимой.

Мой код:

public partial class Form1 : Form
{
    public Graphics drawArea;
    public int xPos, yPos;

    public Form1()
    {
        InitializeComponent();
    }
    private void Form1_Paint(object sender, PaintEventArgs e)
    {
        drawArea = e.Graphics;
        DrawUser();
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        switch (e.KeyCode)
        { 
            case Keys.Down:
                yPos++;
                break;
            case Keys.Up:
                yPos--;
                break;
            case Keys.Left:
                xPos--;
                break;
            case Keys.Right:
                xPos++;
                break;
        }
    }

    private void DrawUser()
    {
        drawArea.FillRectangle(new SolidBrush(Color.Red), xPos, yPos, 50, 50);
    }
}

Итак, когда я нажимаю клавиши со стрелками несколько раз, объект перемещается только после того, как я изменяю размер формы. Я хочу, чтобы он двигался мгновенно, используя только событие рисования.

Спасибо


person Nick Peelman    schedule 03.09.2013    source источник


Ответы (2)


Я нашел это!

Добавляя this.Invalidate(); после нажатия клавиши. Это сообщит событию рисования о перерисовке.

person Nick Peelman    schedule 03.09.2013
comment
Отличная находка! Отличная работа :) - person crthompson; 04.09.2013

Похоже, вы связываете свою форму, поэтому она не обновляется, пока вы ее не переместите. Попробуйте поместить DoEvents после drawArea в DrawUser

private void DrawUser()
{
    drawArea.FillRectangle(new SolidBrush(Color.Red), xPos, yPos, 50, 50);
    Application.DoEvents();
}

Однако будьте осторожны с DoEvents, это может быть злом.

person crthompson    schedule 03.09.2013
comment
Попробовал, как вы сказали, также за оператором switch, но он все еще заморожен :( - person Nick Peelman; 04.09.2013
comment
Теперь я присматриваюсь и вижу, что вы не вызываете DrawUser внутри события нажатия клавиши. - person crthompson; 04.09.2013
comment
Это правда, если бы я это сделал, я получил бы ошибку с недопустимым параметром (вероятно, переменная drawArea). - person Nick Peelman; 04.09.2013
comment
Я нашел это, добавил ответ, если вам интересно - person Nick Peelman; 04.09.2013