Простая анимация в WinForms

Представьте, что вы хотите анимировать некоторый объект в WinForm. Вы устанавливаете таймер для обновления состояния или модели и переопределяете событие рисования формы. Но оттуда, как лучше постоянно перекрашивать форму для анимации?

  • Аннулировать форму, как только вы закончили рисовать?
  • Установить второй таймер и сделать форму недействительной на регулярной основе?
  • Возможно, есть общий шаблон для этой вещи?
  • Есть ли полезные классы .NET, чтобы помочь?

Каждый раз, когда мне нужно сделать это, я обнаруживаю новый метод с новым недостатком. Каков опыт и рекомендации сообщества SO?

14.08.2008 16:44:42
3 ОТВЕТА
РЕШЕНИЕ

В некоторых ситуациях быстрее и удобнее не рисовать с использованием события рисования, а получать объект Graphics из элемента управления / формы и рисовать его «на». Это может создать некоторые проблемы с непрозрачностью / сглаживанием / текстом и т. Д., Но может стоить того, чтобы не перекрашивать весь шабанг. Что-то вроде:

private void AnimationTimer_Tick(object sender, EventArgs args)
{
    // First paint background, like Clear(Control.Background), or by
    // painting an image you have previously buffered that was the background.
    animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++])); 
}

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

10
19.06.2012 09:20:49
Бьюсь об заклад, это так! Никогда не использовал это все же.
Peteter 20.01.2013 17:21:23

То, что вы делаете, является единственным решением, которое я когда-либо использовал в WinForms (таймер с постоянными перерисовками). Существует множество методов, которые вы можете использовать, чтобы сделать работу пользователя более удобной (например, двойная буферизация).

Возможно, вы захотите попробовать WPF. В WPF есть встроенные средства для создания анимации, и они гораздо более плавные (и требуют меньше кода и никакой синхронизации с вашей стороны), чем решение на основе таймера.

Обратите внимание, что вам не нужно использовать WPF во всем приложении для этого решения; можно упаковать эту функциональность в элемент управления WPF и встроить элемент управления в приложение WinForms (или, в этом отношении, неуправляемое приложение):

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

4
14.08.2008 16:50:10

Я создал библиотеку, которая может помочь с этим. Он называется Transitions и может быть найден здесь: http://code.google.com/p/dot-net-transitions/

Для анимации объектов используются таймеры, работающие в фоновом потоке. Библиотека с открытым исходным кодом, поэтому, если она вам пригодится, вы можете посмотреть на код, чтобы увидеть, что он делает.

49
20.07.2009 21:10:10
Почему это не на Nuget!
The Muffin Man 15.05.2014 17:30:36
спустя 10 лет я нахожу это. Я плачу слезами радости, поскольку это добавляет множество функциональных возможностей к winforms. Спасибо за ваше обслуживание тем из нас, кому необходимо поддерживать наследие.
Digit Plays 23.01.2020 21:15:41