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

Тема в разделе "MS Visual C++", создана пользователем -, 14 фев 2012.

  1. Гость

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

    Код (Text):
    // 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);
    }
    Прикрепил анимацию и исходный код. Чтобы завершить работу анимации, щелкните два раза ПРАВОЙ кнопкой мыши.

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

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

    Вложения:

    • Animasya.zip
      Размер файла:
      1,9 МБ
      Просмотров:
      4
    • Animasya2.zip
      Размер файла:
      34,2 КБ
      Просмотров:
      4
  2. Гость

    Если анимацию перекрыть каким нибудь окном, то анимация стирается. И делается просто белое окно.
     
  3. Гость

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

    <!--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]

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

    Вложения:

    • Animasya.rar
      Размер файла:
      1,3 МБ
      Просмотров:
      2
Загрузка...

Поделиться этой страницей