ОБСУЖДЕНИЕ

Перестает Воспроизводиться Анимация.

2 ответов 4,1 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Анимация состоит из 10 картинок, которые непрерывно заменяют друг друга. Но после нескольких циклов анимация вдруг останавливается и дальше не идет. В чем может быть дело?
Вот код:

Код:
// Animasya2.cpp: определяет точку входа для приложения.
#include "stdafx.h"
#include "Animasya2.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst;								// текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING];					// Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING];			// имя класса главного окна
HWND hWnd; 
HBITMAP maskBitmap;
POINT MousePnt;
bool dragging=false;
int a=0, close=0;

// Отправить объявления функций, включенных в этот модуль кода:
ATOM				MyRegisterClass(HINSTANCE hInstance);
BOOL				InitInstance(HINSTANCE, int);
LRESULT CALLBACK	WndProc(HWND, UINT, WPARAM, LPARAM);
void				MakeBitmapRegion();

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR	lpCmdLine,
int	  nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;

// Инициализация глобальных строк
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_ANIMASYA2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow)) return FALSE;

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ANIMASYA2));

int Style;
Style = GetWindowLong(hWnd, GWL_STYLE);
Style = Style || WS_CAPTION;
Style = Style || WS_SYSMENU;

SetWindowLong(hWnd, GWL_STYLE, Style);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

SetTimer(hWnd, 1, 100, NULL); // Запускаем таймер на интервал 0.1 секунды

// Цикл основного сообщения:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize		= sizeof(WNDCLASSEX);
wcex.style			= CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc	= WndProc;
wcex.cbClsExtra		= 0;
wcex.cbWndExtra	= 0;
wcex.hInstance		= hInstance;
wcex.hIcon		= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ANIMASYA2));
wcex.hCursor		= LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground	= (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName	= 0;
wcex.lpszClassName	= szWindowClass;
wcex.hIconSm		= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, 100, 100, NULL, NULL, hInstance, NULL);

if (!hWnd) return FALSE;

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc, hdcBits;
RECT wndrect;
POINT point;

switch (message)
{
case WM_COMMAND:
wmId	= LOWORD(wParam);
wmEvent = HIWORD(wParam);
break;
case WM_TIMER:
MakeBitmapRegion(); // если сработал таймер, смена картинки
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);

hdcBits=::CreateCompatibleDC(hdc);
SelectObject(hdcBits, maskBitmap);
BitBlt(hdc, 0, 0, 100, 100, hdcBits, 0, 0, SRCCOPY);

DeleteObject(SelectObject(hdcBits, maskBitmap)); // Освободить bitmap
DeleteDC(hdcBits);
DeleteDC(hdc);

EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN: // когда нажата левая кнопка мыши
GetCursorPos(&MousePnt);
dragging = true;
SetCapture(hWnd);
break;
case WM_MOUSEMOVE: // когда курсор мышки движется по экрану
if (dragging) // Если нажата кнопка, то...
{
GetCursorPos(&point); // Получить текущую позицию курсора
GetWindowRect(hWnd, &wndrect); // Получить текущие размеры окна
// Откорректировать положение окна
wndrect.left = wndrect.left+(point.x - MousePnt.x);
wndrect.top = wndrect.top +(point.y - MousePnt.y);
// Установить новые размеры окна
SetWindowPos(hWnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
MousePnt=point; // Запоминаем текущую позицию курсора
}
break;
case WM_LBUTTONUP: // когда левая кнопка мыши отпущена, переносим анимацию на новое место
if (dragging)
{
dragging=false;
ReleaseCapture();
}
break;
case WM_RBUTTONDOWN: // когда нажата правая кнопка мыши
close++;
if (close > 1) PostQuitMessage(0); // если нажата второй раз, завершить работу
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
} 
void MakeBitmapRegion ()
{
// Выбор картинок 
if (a == 0) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP0)); 
else if (a == 1) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP1));
else if (a == 2) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP2));
else if (a == 3) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP3));
else if (a == 4) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP4));
else if (a == 5) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP5));
else if (a == 6) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP6));
else if (a == 7) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP7));
else if (a == 8) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP8));
else if (a == 9) maskBitmap = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP9));

if (!maskBitmap) return;

a++; // счетчик для картинок
if (a > 9 || a < 0) a = 0; 

COLORREF back_color;
BITMAP bmp_o;

GetObject(maskBitmap, sizeof(BITMAP), &bmp_o);
int w = bmp_o.bmWidth;
int h = bmp_o.bmHeight;

HDC wnd_dc = GetDC(hWnd);
if (hWnd  == NULL) return;
if (wnd_dc == NULL) return;

HDC hdc_bmp = CreateCompatibleDC (wnd_dc);
SelectObject (hdc_bmp, maskBitmap);
back_color = GetPixel(hdc_bmp, 0, 0);

int x, x0, y;
HRGN wnd_rgn;
wnd_rgn = CreateRectRgn(0,0,0,0);
HRGN tmp_rgn;

x = y = 0;
for (y; y < h; y++)
{
while (x < w-1)
{
while(GetPixel(hdc_bmp, x, y) == back_color && x < w) x++;
if( x != w )
{
x0 = x;
while(GetPixel(hdc_bmp, x, y) != back_color && x < w) x++;
tmp_rgn = CreateRectRgn(x0, y, x, y+1);
CombineRgn(wnd_rgn, wnd_rgn, tmp_rgn, RGN_XOR);
}
}
x = 0;
}

SetWindowRgn(hWnd, wnd_rgn, TRUE);
InvalidateRect(hWnd, 0, false);

DeleteObject(wnd_rgn);
DeleteObject(tmp_rgn);

DeleteDC(hdc_bmp);
DeleteDC(wnd_dc);
}

Прикрепил анимацию и исходный код. Чтобы завершить работу анимации, щелкните два раза ПРАВОЙ кнопкой мыши.

Добавлено: Опа. В прошлом посте только исходный прикрепился...Прикрепил саму анимацию.
Чтобы завершить работу анимации, щелкните два раза ПРАВОЙ кнопкой мыши.

Добавлено: Во второй раз удалось не прикрепить, пробую в третий раз.
 

Вложения

Если анимацию перекрыть каким нибудь окном, то анимация стирается. И делается просто белое окно.
 
Теперь все работает даже лучше, чем я думал.
Вот код, если кому надо:

<!--shcode--><pre><code class='sql'>// Animasya2.cpp: определяет точку входа для приложения.
#include "stdafx.h"
#include "Animasya2.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:
HINSTANCE hInst; // текущий экземпляр
TCHAR szTitle[MAX_LOADSTRING]; // Текст строки заголовка
TCHAR szWindowClass[MAX_LOADSTRING]; // имя класса главного окна
HWND hWnd;

HBITMAP maskBitmap0;
HBITMAP maskBitmap1;
HBITMAP maskBitmap2;
HBITMAP maskBitmap3;
HBITMAP maskBitmap4;
HBITMAP maskBitmap5;
HBITMAP maskBitmap6;
HBITMAP maskBitmap7;
HBITMAP maskBitmap8;
HBITMAP maskBitmap9;

POINT MousePnt;
bool dragging=false;
int a=0, close=0, c=0;

// Отправить объявления функций, включенных в этот модуль кода:
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.
MSG msg;
HACCEL hAccelTable;

// Инициализация глобальных строк
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_ANIMASYA2, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:
if (!InitInstance (hInstance, nCmdShow)) return FALSE;

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ANIMASYA2));

DWORD dwStyle = GetWindowLong(hWnd, GWL_STYLE);
dwStyle &= ~(WS_CAPTION|WS_SIZEBOX);
SetWindowLong(hWnd, GWL_STYLE, dwStyle);
InvalidateRect(hWnd, NULL, TRUE);
SetWindowPos(hWnd, NULL, 0,0,100,100, SWP_NOMOVE|SWP_NOZORDER);

SetWindowLong(hWnd, GWL_EXSTYLE, 0x80000);
SetLayeredWindowAttributes(hWnd, RGB(255, 255, 255), 0, LWA_COLORKEY);

ShowWindow(hWnd, nCmdShow);
//ShowWindow(hWnd, SW_HIDE);
UpdateWindow(hWnd);

SetWindowLong(hWnd, GWL_EXSTYLE, 0x80000);
SetLayeredWindowAttributes(hWnd, RGB(255, 255, 255), 0, LWA_COLORKEY); //LWA_ALPHA

maskBitmap0 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP0));
maskBitmap1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP1));
maskBitmap2 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP2));
maskBitmap3 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP3));
maskBitmap4 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP4));
maskBitmap5 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP5));
maskBitmap6 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP6));
maskBitmap7 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP7));
maskBitmap8 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP8));
maskBitmap9 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BMP9));

SetTimer(hWnd, 1, 100, NULL);

// Цикл основного сообщения:
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}

return (int) msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ANIMASYA2));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = CreateSolidBrush(RGB(255, 255, 255));
wcex.lpszMenuName = 0;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU,
-100, -100, 100, 100, NULL, NULL, hInstance, NULL); // CW_USEDEFAULT

if (!hWnd) return FALSE;

ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);

return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc, hdcBits;
RECT wndrect;
POINT point;

switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
break;
case WM_TIMER:
a++;
if (a > 9 || a < 0) a = 0;

hdc = BeginPaint(hWnd, &ps);
hdcBits=::CreateCompatibleDC(hdc);

if (a == 0) SelectObject(hdcBits, maskBitmap0);
else if (a == 1) SelectObject(hdcBits, maskBitmap1);
else if (a == 2) SelectObject(hdcBits, maskBitmap2);
else if (a == 3) SelectObject(hdcBits, maskBitmap3);
else if (a == 4) SelectObject(hdcBits, maskBitmap4);
else if (a == 5) SelectObject(hdcBits, maskBitmap5);
else if (a == 6) SelectObject(hdcBits, maskBitmap6);
else if (a == 7) SelectObject(hdcBits, maskBitmap7);
else if (a == 8) SelectObject(hdcBits, maskBitmap8);
else if (a == 9) SelectObject(hdcBits, maskBitmap9);

BitBlt(hdc, 0, 0, 100, 100, hdcBits, 0, 0, SRCCOPY);
DeleteDC(hdcBits);
DeleteDC(hdc);
EndPaint(hWnd, &ps);
InvalidateRect(hWnd, 0, false);

if (c == 0) SetWindowPos(hWnd, HWND_TOPMOST, 100,100,0,0, SWP_NOSIZE);
c = 1;
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
hdcBits=::CreateCompatibleDC(hdc);

if (a == 0) SelectObject(hdcBits, maskBitmap0);
else if (a == 1) SelectObject(hdcBits, maskBitmap1);
else if (a == 2) SelectObject(hdcBits, maskBitmap2);
else if (a == 3) SelectObject(hdcBits, maskBitmap3);
else if (a == 4) SelectObject(hdcBits, maskBitmap4);
else if (a == 5) SelectObject(hdcBits, maskBitmap5);
else if (a == 6) SelectObject(hdcBits, maskBitmap6);
else if (a == 7) SelectObject(hdcBits, maskBitmap7);
else if (a == 8) SelectObject(hdcBits, maskBitmap8);
else if (a == 9) SelectObject(hdcBits, maskBitmap9);

BitBlt(hdc, 0, 0, 100, 100, hdcBits, 0, 0, SRCCOPY);
DeleteDC(hdcBits);
DeleteDC(hdc);
EndPaint(hWnd, &ps);
break;
case WM_LBUTTONDOWN: // когда нажата левая кнопка мыши
GetCursorPos(&MousePnt);
dragging = true;
SetCapture(hWnd);
break;
case WM_MOUSEMOVE: // когда курсор мышки движется по экрану
if (dragging) // Если нажата кнопка, то...
{
GetCursorPos(&point); // Получить текущую позицию курсора
GetWindowRect(hWnd, &wndrect); // Получить текущие размеры окна
// Откорректировать положение окна
wndrect.left = wndrect.left+(point.x - MousePnt.x);
wndrect.top = wndrect.top +(point.y - MousePnt.y);
// Установить новые размеры окна
SetWindowPos(hWnd, NULL, wndrect.left, wndrect.top, 0, 0, SWP_NOZORDER | SWP_NOSIZE);
MousePnt=point; // Запоминаем текущую позицию курсора
}
break;
case WM_LBUTTONUP: // когда левая кнопка мыши отпущена
if (dragging)
{
dragging=false;
ReleaseCapture();
}
break;
case WM_RBUTTONDOWN: // когда нажата правая кнопка мыши
close++;
if (close > 1) PostQuitMessage(0);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}[/CODE]

Прикрепил исходник.
 

Вложения