Winapi 当我使用CreateSolidBrush作为参数来设置ClassLongPtr(hwnd、GCLP\HBRBACKGROUND、,

Winapi 当我使用CreateSolidBrush作为参数来设置ClassLongPtr(hwnd、GCLP\HBRBACKGROUND、,,winapi,Winapi,我通过在红色和橙色之间波动背景色来模仿爆炸 在使用SetClassLongPtr(hwnd,GCLP_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(255,0,0)))之后,我是否必须使用DeleteObject或以某种方式释放对象 void ExplosionVisuals(HWND-HWND) { 对于(int i=0;i

我通过在红色和橙色之间波动背景色来模仿爆炸

在使用SetClassLongPtr(hwnd,GCLP_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(255,0,0)))之后,我是否必须使用DeleteObject或以某种方式释放对象

void ExplosionVisuals(HWND-HWND)
{
对于(int i=0;i<10;++i)
{
SetClassLongPtr(hwnd,GCLP_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(255,0,0));//红色
无效(hwnd,NULL,true);
更新窗口(hwnd);
睡眠(100);
SetClassLongPtr(hwnd,GCLP_HBRBACKGROUND,(LONG)CreateSolidBrush(RGB(255,153,0));//橙色
无效(hwnd,NULL,true);
更新窗口(hwnd);
睡眠(100);
}
SetClassLongPtr(hwnd,GCLP_HBRBACKGROUND,(长)GetStockObject(白色_笔刷));
无效(hwnd,NULL,true);
更新窗口(hwnd);
返回;
}

此代码泄漏笔刷。如果您真的希望每次循环都创建新的笔刷,则必须获取以前的值(由
SetClassLongPtr
返回)并将其丢弃

一个更好的方法是创建两个与应用程序具有相同寿命的笔刷。如此频繁地创建新笔刷是浪费。使用此方法,您可以在关机时处理笔刷


至于动画的实际实现,正如你所承认的,你的代码相当糟糕。
Sleep
很少能解决任何问题,而且它肯定不在这里。你最好使用计时器。正如Hans正确指出的那样,你应该处理
WM_ERASEBKGND
来设置背景画笔。一旦你切换到timer那么你不需要调用UpdateWindow。

那太糟糕了。你当然需要。为WM_ERASEBKGND实现一个消息处理程序。谢谢你的回复,我会支持你,但我需要15个声誉。
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;
}