Плавная анимация с GDI + в C ++ - PullRequest
0 голосов
/ 19 мая 2018

У меня проблемы с получением простых плавных анимаций с использованием GDI + в C ++.Мой текущий подход использует таймер WinAPI, как описано здесь .Я инициализирую таймер с SetTimer с интервалом 15 мс.Затем, когда происходит соответствующее событие WM_TIMER, я увеличиваю верхние левые координаты выпрямителя, вызывая InvalidateRect для всего экрана и рисуя выпрямитель.Результатом является ожидаемое движение, но с регулярным мерцанием (см. видео ).Кажется, это зависит от интервала, но он всегда есть.

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

РЕДАКТИРОВАТЬ: Забыл добавить - это школьный проект, поэтому изменение технологий или языков на самом деле не вариант для меня.

1 Ответ

0 голосов
/ 20 мая 2018

Используйте флаг FALSE для bErase в InvalidateRect.

InvalidateRect( hwnd, NULL, FALSE );

Или обрабатывайте WM_ERASEBKGND сообщение

LRESULT CALLBACK YourWindowProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
{
    switch ( msg )
    {
    case WM_ERASEBKGND:
        // Don't paint background if you are blitting from off screen surface.
        return 1;
    }
    return DefWindowProc( hwnd, msg, wparam, lparam );
}

Или поместите NULL кисть в класс окна(используется для определения RegisterClass).

...