Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2012, 16:43   #1
Юрий90
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 12
Плохо Перестает работать анимация.

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

Код:
// Глобальные переменные
HWND hWnd; 
HBITMAP maskBitmap;
int a=0, close=0;

// Обработка сообщений
    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;
    
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);
}
Приложил исходный код.
В приложении Animasya2.zip находится сама анимация, чтобы ее закрыть, нужно щелкнуть по ней два раза ПРАВОЙ кнопкой мыши.
Если ее перекрыть любым окном, то она становится белой.
Вложения
Тип файла: zip Animasya.zip (1.88 Мб, 11 просмотров)
Тип файла: zip Animasya2.zip (34.2 Кб, 7 просмотров)
Юрий90 вне форума Ответить с цитированием
Старый 14.02.2012, 19:45   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

попробовал код, вылетает ошибка здесь
Код:
DeleteObject(tmp_rgn);
использование переменной до инициализации
microbit вне форума Ответить с цитированием
Старый 14.02.2012, 20:50   #3
Юрий90
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 12
По умолчанию

Цитата:
Сообщение от microbit Посмотреть сообщение
попробовал код, вылетает ошибка здесь
Код:
DeleteObject(tmp_rgn);
использование переменной до инициализации
Но я же ее инициализировал. Странно...
Юрий90 вне форума Ответить с цитированием
Старый 15.02.2012, 13:30   #4
Юрий90
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 12
Радость Анимация заработала как надо!

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

Код:
#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);
	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;
}
Прикрепил исходный код:
Вложения
Тип файла: rar Animasya.rar (1.31 Мб, 14 просмотров)
Юрий90 вне форума Ответить с цитированием
Старый 15.02.2012, 13:32   #5
Юрий90
Пользователь
 
Регистрация: 26.05.2011
Сообщений: 12
По умолчанию

Продолжение кода:

Код:
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;
}
Юрий90 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоподстановка перестает работать GekFinn Microsoft Office Access 1 19.01.2012 11:38
при открытии другой книги скрипт перестает работать gramp Microsoft Office Excel 5 14.02.2011 14:11
ПЕРЕСТАЕТ РАБОТАТЬ МАКРОС Cone Microsoft Office Excel 3 15.08.2010 13:49
ПЕРЕСТАЕТ РАБОТАТЬ СОРТИРОВЩИК Cone Microsoft Office Excel 5 10.08.2010 16:36
Не работает клава а при нажатии на нее перестает работать мышь!! Дима я Компьютерное железо 10 02.03.2010 17:10