Нужно ли освобождать память вручную, когда я использую CreateSolidBrush в качестве параметра SetClassLongPtr (hwnd, GCLP_HBRBACKGROUND, - PullRequest
2 голосов
/ 17 октября 2011

Я делаю неудачную имитацию взрыва, меняя цвет фона между красным и оранжевым.

Нужно ли мне использовать DeleteObject или как-то освободить объект после использования SetClassLongPtr (hwnd, GCLP_HBRBACKGROUND, (LONG) CreateSolidBrush (RGB (255, 0, 0)))?

void ExplosionVisuals(HWND hwnd)
{
    for (int i = 0; i < 10; ++i)
    {
        SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG) CreateSolidBrush( RGB(255, 0, 0) ) ); // Red
        InvalidateRect(hwnd, NULL, true);
        UpdateWindow(hwnd);
        Sleep(100);
        SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG) CreateSolidBrush( RGB(255, 153, 0) ) ); // Orange
        InvalidateRect(hwnd, NULL, true);
        UpdateWindow(hwnd);
        Sleep(100);
    }

    SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, (LONG) GetStockObject(WHITE_BRUSH) );
    InvalidateRect(hwnd, NULL, true);
    UpdateWindow(hwnd);
    return;
}

1 Ответ

2 голосов
/ 17 октября 2011

Этот код пропускает кисти. Если вы действительно хотите создавать новые кисти каждый раз вокруг цикла, тогда вам нужно получить предыдущее значение (возвращаемое SetClassLongPtr) и избавиться от него.

Гораздо лучшим подходом было бы создание двух кистей с таким же временем жизни, как у приложения. Бесполезно так часто создавать новые кисти. При таком подходе вы избавляетесь от щеток при выключении.

Что касается фактической реализации анимации, ваш код, как вы признаете, довольно плохой. Sleep очень редко является решением любой проблемы, и, конечно, его здесь нет. Тебе лучше с таймером. И как правильно указывает Ганс, вы должны обработать WM_ERASEBKGND, чтобы установить кисть фона. Как только вы переключаетесь на таймер, вам не нужно вызывать UpdateWindow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...