win32画窗体背景

背景:
应产品需求将窗口加载时的loading.gif换了一张,原先是白底的GIF,然后换了一张黑底的GIF,放上去真的好丑,因为窗体的背景色是白色。
然后就需要我给窗体画个背景颜色融合这个新的GIF,踩了很多openGL、ondraw等很多坑,这里先po一下代码

void OnPaint(HDC hdc)
{
    if (m_pGif&& !m_bLoadEnd)
    {
        HBRUSH hBrush;
        RECT rect;
        SetRect(&rect, 0, 0,GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN));
        hBrush = CreateSolidBrush(RGB(34, 34, 34));
        FillRect(hdc, &rect, hBrush);
        hBrush = NULL;
        m_pGif->OnPaint(hdc);
    }
}

这个代码把黑色背景画出来了。
原理:窗体创建之后,在注册的消息循环类WinProc里接受

case WM_PAINT:
    {
        if (window)
        {
            PAINTSTRUCT ps;
            RECT rc;
            HDC hdc = BeginPaint(hWnd, &ps);
            window->OnPaint(hdc);
            EndPaint(hWnd, &ps);
        }
        break;
    }

这样就可以在窗体创建之后调用onpaint,所以我在onpaint中实现画背景这个功能。
但是运行发现上面的代码其实是有问题的,我的loading图片一直在闪烁。查阅资料后说需要实现双缓冲,这是我当时网上找到的代码

HDC memDC = CreateCompatibleDC(hdc);//内存DC   
HBITMAP memBitmap = CreateCompatibleBitmap(hdc, Width, Height); //建立和屏幕兼容的bitmap    
HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);//将memBitmap选入内存DC   

//这里在memDC上绘制
{

}

//贴图到目标DC
BitBlt(hdc, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY);
//结束清理
SelectObject(memDC, hOldBitmap);
DeleteObject(memBitmap);
DeleteDC(memDC);

因为画的时候是一个像素一个像素画的,每画一笔窗体都会刷新一次,所以会出现闪烁的现象,而双缓冲是在窗体里建立一个缓冲池,缓冲池满的时候再刷新,而且刷新的是缓冲区而不是窗体
这是我双缓冲的代码

void OnPaint(HDC hdc)
{
    if (m_pGif && !m_bLoadEnd)
    {
        int Width = GetSystemMetrics(SM_CXSCREEN);
        int Height = GetSystemMetrics(SM_CYSCREEN);
        HDC memDC = CreateCompatibleDC(hdc);//内存DC   
        HBITMAP memBitmap = CreateCompatibleBitmap(hdc, Width, Height); //建立和屏幕兼容的bitmap    9)HBITMAP hOldBitmap = (HBITMAP)SelectObject(memDC, memBitmap);//将memBitmap选入内存DC   
        //这里在memDC上绘制
        {
            HBRUSH hBrush;
            RECT rect;
            SetRect(&rect, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
            hBrush = CreateSolidBrush(RGB(34, 34, 34));
            FillRect(memDC, &rect, hBrush);
            hBrush = NULL;
            m_pGif->OnPaint(memDC);
        }
        //贴图到目标DC
        BitBlt(hdc, 0, 0, Width, Height, memDC, 0, 0, SRCCOPY);
        //结束清理
        SelectObject(memDC, hOldBitmap);
        DeleteObject(memBitmap);
        DeleteDC(memDC);
    }
}

到这里逻辑基本就正确了,但是运行发现闪烁的更厉害了。
排查分析后发现有一处错误:(9)我在代码里标了。
HBITMAP hOldBitmap这个不能建立临时变量,所以我在类里定义了HBITMAP hOldBitmap变量,在函数里直接用,而不是重新定义。
OK,完美的解决把黑色GIF放进去了
工作原因不方便放图~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值