2008-10-08 7 views
4

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

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

myCustomControl.left -= m_iSpeed;

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

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

Спасибо!

+0

Какого GUI инструментарий вы используете? – 2008-10-08 12:03:10

ответ

3

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

this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | 
    ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor, 
    true); 
1

Подобное обсуждение состоялось сегодня утром по этому вопросу. visual c# form update results in flickering., поэтому я буду ленив и даю тот же ответ, который я дал там:

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

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

0

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

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

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