Мерцание анимации WM_TIMER

Хорошо, я использую таймер с временем задержки 50 мс, чтобы анимировать движущийся текст (технически это прокрутка текста).
Проблема в том, что если вы присмотритесь, вы увидите, что текст мерцает, и мне нравится, что он не мерцает ..

Так что я плохо разбираюсь в анимации, но могу ли я что-нибудь сделать, чтобы уменьшить мерцание? Может быть, время будет быстрее? Или мне вообще следует использовать для этого таймер?

EDIT:
Итак, я попытался реализовать двойную буферизацию и, очевидно, что-то делаю.

Вот код без двойной буферизации, он работает нормально, но немного мерцает.

void PaintScrollingText(ScrollingText *Settings, WPARAM wParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    HANDLE hOldFont;
    RECT rect;

    hdc = wParam ? (HDC)wParam : BeginPaint(Settings->hWnd, &ps);

    hOldFont = SelectObject(hdc, Settings->hFont);

    SetTextColor(hdc, Settings->crForeGnd);
    SetBkColor(hdc, Settings->crBackGnd);

    GetClientRect(Settings->hWnd, &rect);

    rect.right -= Settings->txt1XOffset;
    DrawText(hdc, Settings->szText1, -1, &rect, DT_RIGHT);

    rect.right += Settings->txt1XOffset - Settings->txt2XOffset;
    DrawText(hdc, Settings->szText2, -1, &rect, DT_RIGHT);

    SelectObject(hdc, hOldFont);

    if (!wParam) EndPaint(Settings->hWnd, &ps);
}

А это мой код с двойной буферизацией.

void PaintScrollingText(ScrollingText *Settings, WPARAM wParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    RECT rect;

    GetClientRect(Settings->hWnd, &rect);

    hdc = wParam ? (HDC)wParam : BeginPaint(Settings->hWnd, &ps);

    // Create off-screen DC
    HDC hdcMem = CreateCompatibleDC(hdc);

    // Create a bitmap to draw on
    HBITMAP MemBitmap = CreateCompatibleBitmap(hdc, rect.right - rect.left, rect.bottom - rect.top);

    // Select bitmap into off-screen DC
    HGDIOBJ OldBitmap = SelectObject(hdcMem, MemBitmap);

    // Erase background
    HBRUSH hbrBkGnd = CreateSolidBrush(0x000000);
    FillRect(hdcMem, &rect, hbrBkGnd);
    DeleteObject(hbrBkGnd);

    // Set font and color
    HGDIOBJ hOldFont = SelectObject(hdcMem, Settings->hFont);
    SetTextColor(hdcMem, Settings->crForeGnd);
    SetBkColor(hdcMem, Settings->crBackGnd);

    // Draw text
    rect.right -= Settings->txt1XOffset;
    DrawText(hdcMem, Settings->szText1, -1, &rect, DT_RIGHT);

    rect.right += Settings->txt1XOffset - Settings->txt2XOffset;
    DrawText(hdcMem, Settings->szText2, -1, &rect, DT_RIGHT);

    // Blt the changes to the screen DC.
    BitBlt(hdc, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, hdcMem, 0, 0, SRCCOPY);

    // Select old font
    SelectObject(hdcMem, hOldFont);

    // Done with offscreen DC and bitmap
    SelectObject(hdcMem, OldBitmap);
    DeleteObject(MemBitmap);
    DeleteDC(hdcMem);

    if (!wParam) EndPaint(Settings->hWnd, &ps);
}

Первый текст печатается нормально, а второй выглядит так:

А вот полный код без двойной буферизации: http://dl.dropbox.com/u/35314071/ScrollingTextClass .zip
А вот полный код с двойной буферизацией: http://dl.dropbox.com/u/35314071/ScrollingTextClass2.zip

0
задан Josh 10 October 2011 в 22:59
поделиться