2009-12-04 4 views
0

Я пытаюсь переместить изображение в содержащем элементе управления, изменив его свойства Top и Left каждые 20 мс. На черном фоне это немного более гладко, но при назначении элемента управления BackgroundImage картинка оставляет за ним след, пока элемент управления не будет перерисован через несколько секунд, внезапно замедляется, а затем запускается вперед или движется по неровной траектории.Перемещение фотокамер с таймером

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

Есть ли способ сгладить движение изображения?

Благодаря F

+0

system.timer или form.timer? – Fredou

+0

System.Timers.Timer – Michali

+0

Я изменил его на System.Windows.Timer, и движение явно более плавное, но я предпочел бы, чтобы он проходил по другой теме. – Michali

ответ

3

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

Создайте пользовательский элемент управления, переопределите OnPaint и нарисуйте свой «ящик для картин» внутри. Если вы это сделаете, вы также можете вернуть буфер. Сделайте это, вызвав Graphics.FromImage(), чтобы создать графический объект из изображения. Нарисуйте это и, наконец, вызовите g.DrawImage на REAL графическом объекте (в eventArgs) после того, как вы закончите рисование.

+0

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

+0

В вашем коде присутствует ошибочное приложение.DoEvents()? Это объясняет такую ​​задержку. Если вы не используете это, я задаюсь вопросом, что может вызвать проблему. Можете ли вы извлечь его в небольшой, но полный пример? – Quibblesome

+0

Могу ли я упомянуть, что движение теперь ясное, а не jiggery, но только если пользовательский элемент управления работает в своем отдельном приложении. Большое приложение, в котором я хочу запустить его, имеет еще один таймер и делает некоторые другие вещи, поэтому что-то еще захватывает тем временем. Я попробую запустить движение в потоке, и если это не сработает, я вернусь к вам по этому поводу. Благодарю. – Michali

2

Я не знаю точно, как решить эту проблему (кроме перехода на WPF), но я могу сказать, что задержка вы получаете исходит из признания недействительных областей, являющиеся обновляется при перемещении PictureBox. То, что вы хотите сделать, - это как-то вернуть буферную позицию в новую позицию и переключиться на буфер, а не полагаться на GDI, чтобы сделать перерисовку в реальном времени. НТН.

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