Простая анимация в WinForms - PullRequest
21 голосов
/ 14 августа 2008

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

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

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

Ответы [ 3 ]

47 голосов
/ 21 июля 2009

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

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

10 голосов
/ 14 августа 2008

В некоторых ситуациях быстрее и удобнее не рисовать с использованием события рисования, а получать объект 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++])); 
}

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

4 голосов
/ 14 августа 2008

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...