背景:
应产品需求将窗口加载时的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放进去了
工作原因不方便放图~