Каков наилучший способ сделать анимированный пользовательский элемент управления C# без мерцания?
В настоящее время я создаю пользовательский элемент управления, который должен обрабатывать анимацию в проекте C#. Это в основном список, который содержит фиксированное количество элементов, которые подлежат перемещению. Элемент (другой пользовательский элемент управления с фоновым изображением и парой сгенерированных меток) может перемещаться вверх, вниз или быть исключенным из списка.
Я хотел бы создать анимированное движение, когда элементы перемещаются внутри пользовательского элемента управления контейнера, но мне кажется, что перемещение элементов управления с использованием таких линий, как
myCustomControl.left -= m_iSpeed;
вызванное в таймере событие мерцает и имеет ужасный рендеринг даже при включенной двойной буферизации.
Итак, вот вопрос: как лучше всего добиться анимированного управления C# без мерцания? Должен ли я просто не создавать пользовательские элементы управления и обрабатывать все рисунки внутри фонового изображения панели, которое я генерирую? Есть ли метод супер анимации, который я не обнаружил?:)
Спасибо!
4 ответа
Лучше всего для анимации без мерцания сделать рисование самостоятельно (используйте объект Graphics в обработчике события Paint) и использовать двойную буферизацию. В вашем пользовательском элементе управления вам понадобится такой код в конструкторе:
this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer |
ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
true);
Подобное обсуждение состоялось сегодня утром по этому вопросу. обновление формы Visual C# приводит к мерцанию. так что я буду ленивым и дам тот же ответ, что и там:
Вы можете попытаться вызвать это. SuspendLayout (); перед тем, как начать движение, и this.ResumeLayout(false); когда вы закончите перемещать все элементы управления. Таким образом, все элементы управления должны рисовать одновременно, и у вас должно быть меньше мерцания.
С другой стороны, я попытался воспроизвести это здесь, на работе, но, похоже, не удалось. Можете ли вы дать еще пример кода, который я могу исправить?
Обычный способ получить анимацию без мерцания - реализовать двойную буферизацию. Взгляните на эту статью Code Project
http://www.codeproject.com/KB/GDI-plus/flickerFreeDrawing.aspx
Минимизация вызовов для рисования, пока вы не готовы, также является хорошей идеей.