Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Задержать выполнение программы


Автор: kometa_triatlon 5.3.2006, 11:48
Хочу сделать, чтобы по окну плавно перемещалась картинка. Только плавно не получается, если я задаю цикл, она моментально оказывается в конечной точке. Давно интересовал вопрос, есть ли вообще в С++ или МФС функция, которая задерживает выполнение программы? Ну там sleep, delay....
Хотя может как-то по-другому эту задачу решить? К примеру с помощью таймера?

Автор: DeadSoul 5.3.2006, 11:49
Sleep()

Можно двигать по таймеру(WM_TIMER)

Автор: DeadSoul 5.3.2006, 14:00
А ты галочку "Вопрос решен" поставил?

Автор: Coocky 5.3.2006, 15:33
Хочу еще добавить. что ОДНИМ Sleep() плавность анимации не обеспечить, но если интересно-можно обсудить smile

Автор: kometa_triatlon 5.3.2006, 21:10
Возникла проблема: когда я делаю такое:
Код

for(;m_iYPos<=20; m_iYPos--)
{
Sleep(5);
InvalidateRect(NULL);
m_pDC->BitBlt(m_iXPos, m_iYPOs, 46, 48, ...);
}

Получается бяка: рисуется картинка, потом рисуется новая картинка а старая не стирается, получается след после моего битмапа...

Как сделать правильно? Чтобы картинка перемещалась без таких последствий? DirectX что ли использовать...

Автор: Fin 5.3.2006, 21:23
Ты слишком часто посылаеш WM_PAINT. У этого сообшения есть свойство, в обработчике этого сообшения как правило в конце стоит команда EndPaint, которая убивает все остальные сообшения WM_PAINT в очереди. Можно расчитывать регион, с которого уходит твоя картинка, и закрашивать его фоновым цветом (команда FillRect).

Автор: kometa_triatlon 6.3.2006, 01:00
А если у меня под битмапом находится другая картинка либо линия? (Так и есть). Ведь я же их зарисую тогда.

Автор: Earnest 6.3.2006, 10:28
1) Перемещение лучше делать по таймеру: рассчитывать новое положение картинки и вызывать Invalidate
2) Рисование (BitBlt) делать только в OnPaint!
3) Чтобы картинка не дергалась, убрать erasebackground - либо вообще, либо чистить только тот участок, который не заполняется картинкой.
4) Все что сверху, рисовать потом.

Если движется все содержимое окна (все слои), можно попробовать использовать ScrollDC или ScrollWindow
Добавлено @ 10:29
Если изображение сложное (т.е. несколько картинок и графика в разной конфигурации), то, чтобы избежать мерцания, лучше использовать контекст в памяти.

Автор: kometa_triatlon 8.3.2006, 19:32
А почему рисование делать только в OnPaint?
Я создал отдельную функцию для вывода битмапа, все нормально работает.

Автор: Earnest 9.3.2006, 09:20
Цитата(kometa_triatlon @ 8.3.2006, 19:32 Найти цитируемый пост)
А почему рисование делать только в OnPaint?

Я имела в виду - вызывать из OnPaint. Отдельных функций может быть сколько надо.
Почему рисовать в OnPaint - потому что оно ровно для того предназначено. Если в твоем обработчике OnPaint не будет нужного кода рисования, при любом его вызове будет затерто то, что ты нарисовал другой функцией. Можно, конечно, рисовать одно и то же и из OnPaint, и в другом месте (скажем, по таймеру), но зачем размножать код (или даже просто вызовы)?


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)