[C++ WinAPI] Animowanie bitmapy

Odpowiedz Nowy wątek
2006-09-05 10:27
0

Witam,
Siedzę nad tym problemem już tzeci dzień i ani kroku do przodu... Proszę o pomoc :D
Chciałem zrobić prostą animację w WinAPI - mam dwie bitmapy o takim samym rozmiarze i chciałbym wyświetlać je naprzemiennie, żeby uzyskać efekt animacji.
Oto kluczowy fragment kodu - rzecz dzieje się na okienku dialogowym:

//zmienne globalne do rysowania bitmapy
BITMAP bmInfo;
HBITMAP hBmp = NULL, hBmp2 = NULL;
HDC hdc, hdcNowy;          
PAINTSTRUCT ps;
unsigned char nb = 0;    //określa która bitmapa została wyświetlona
BOOL CALLBACK DlgProc2(HWND hDlg2, UINT Message, WPARAM wParam, LPARAM lParam)
{        
    switch(Message)
    {                 
        case WM_INITDIALOG:
             if (hBmp == NULL)  //jeżeli ładujemy bitmapę po raz pierwszy
             {            
                 hBmp = LoadBitmap(hInst, MAKEINTRESOURCE(IDI_CLOCK));
                 hBmp2 = LoadBitmap(hInst, MAKEINTRESOURCE(IDI_CLOCK2));
                 GetObject(hBmp, sizeof(bmInfo), &bmInfo);        //pobiera informacje o bitmapie do struktury bmInfo
             }
             SetTimer(hDlg2, 1, 300, NULL);              //timer ustawiony na 300ms
             break;
 
        case WM_PAINT:
             hdc = BeginPaint(hDlg2, &ps);           //rysujemy po okienku dialogowym hDlg2
             hdcNowy = CreateCompatibleDC(hdc);
 
             if (nb) SelectObject(hdcNowy, hBmp);    //tu ładujemy bitmapę pierwszą 
             else SelectObject(hdcNowy, hBmp2);     //...a tu drugą
 
             BitBlt(hdc, 128, 40, bmInfo.bmWidth, bmInfo.bmHeight, hdcNowy, 0, 0, SRCCOPY);    
 
             ReleaseDC(hDlg2, hdc);
             DeleteDC(hdcNowy);
             EndPaint(hDlg2, &ps); 
             break;
 
        case WM_TIMER:           
                nb = !nb;
                UpdateWindow(hDlg2);
             break;
...
...
...

Sposób działania wydawał mi się prosty - co 300ms wartość zmiennej nb zmienia się na przeciwną, wywołuje się zdarzenie WM_PAINT /cytując MSDN:

"The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty."
/.
W zależności od wartości zmiennej nb ładuje się albo bitmapa 1 albo 2, która następnie jest wyświetlana...
Niestety, nie działa to tak jak powinno - program wyświetla tylko tą drugą bitmapę... Kiedy zasłonię okienko programu innym oknem i odsłonię je ponownie /zdaje się że to wywołuje zdarzenie WM_PAINT/, to - jak trafię - bitmapa się zmieni na inną... Niestety nie działa to automatycznie...
Pytanie co jest nie tak?
Dziękuję za każdą wskazówkę i pozdrawiam!

Pozostało 580 znaków

2006-09-05 11:18
0

przed wywolanie BeginPaint () musisz uniewaznic obszar ktory chcesz odrysowac funkcja InvalidateRect ()

Pozostało 580 znaków

2006-09-05 11:21
0

Zamiast UpdateWindow daj RedrawWindow z flagami RDW_INVALIDATE i RDW_UPDATENOW. Dodatkowo ustaw lprcUpdate do obszaru animacji co by gładko to wszystko chodziło.

Pozostało 580 znaków

2006-09-05 12:28
0

Rzeczywiście, pomogło! Ustawiłem strukturę RECT, użyłem RedrawWindow() i teraz śmiga jak fryga :P
Dziękuję bardzo i pozdrawiam!

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0