2008-08-14 5 views
19

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

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

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

ответ

9

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

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++])); 
} 

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

+0

Не лучше ли это сделать с классом BufferedGraphics? – 2013-01-19 00:46:03

+0

Держу пари! Никогда не использовал его. – Peteter 2013-01-20 17:21:23

3

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

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

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

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

44

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

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

Смежные вопросы