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!