Каков наилучший способ сделать анимированный пользовательский элемент управления C # без мерцания? - PullRequest
4 голосов
/ 08 октября 2008

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

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

myCustomControl.left -= m_iSpeed;

, вызванное событием таймера, мерцает и имеет ужасный рендеринг, даже при включенной двойной буферизации.

Итак, вот вопрос: Каков наилучший способ создания анимированного элемента управления C # без мерцания? Стоит ли просто не создавать пользовательские элементы управления и обрабатывать все рисунки внутри фонового изображения панели, которое я генерирую? ? Есть ли метод супер анимации, который я не обнаружил? :)

Спасибо!

Ответы [ 4 ]

3 голосов
/ 08 октября 2008

Лучшая ставка для анимации без мерцания - рисовать самостоятельно (использовать объект Graphics в обработчике события Paint) и использовать двойную буферизацию. В вашем пользовательском элементе управления вам понадобится такой код в конструкторе:

this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | 
    ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
    true);
1 голос
1 голос
/ 08 октября 2008

Подобное обсуждение состоялось сегодня утром по этому вопросу. визуальное обновление формы c # приводит к мерцанию. , поэтому я буду ленивым и дам тот же ответ, что и там:

Вы можете попытаться вызвать this.SuspendLayout (); перед началом движения и this.ResumeLayout (false); после завершения перемещения всех элементов управления. Таким образом, все элементы управления должны рисовать одновременно, и у вас должно быть меньше мерцания.

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

0 голосов
/ 08 октября 2008

Обычный способ получить анимацию без мерцания - реализовать двойную буферизацию. Взгляните на эту статью Code Project

http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx

Минимизация вызовов для рисования, пока вы не готовы, также является хорошей идеей.

...