(四)MFC学习之双缓冲贴图
程序员文章站
2022-06-11 10:50:02
...
何为双缓冲?
双缓冲自然是相对一般的单缓冲而言的,
单缓冲
那么先从单缓冲开始吧,先上代码((二)MFC学习之贴图 中使用到)
:(代码片段)
初始化:
CClientDC dc(this);
mdc = new CDC;
//创建适配dc
mdc->CreateCompatibleDC(&dc);
mbmp = new CBitmap;
mbmp->m_hObject = LoadImage(0, TEXT("crimer2.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
//选取位图(选取背景位图)
mdc->SelectObject(mbmpBack);
dc.BitBlt(0,0, 786, 481, mdc, 0, 0, SRCCOPY);//
可以看到:LoadImg(这是将位图加载到内存)
然后selectObject,选取内存中的位图
最后 dc.BitBlt 将内存中的位图绘制到窗口(是只有一次加载到内存的,姑且称之为单缓冲)
再来看看双缓冲示例:
void CMyWnd::OnPaint()
{
////这里只能使用CPaintDc
CPaintDC dc(this); // device context for painting
// TODO: 在此处添加消息处理程序代码
// 不为绘图消息调用 CFrameWnd::OnPaint()
CRect rc;
GetClientRect(&rc);
CDC cacheDc;
//缓存位图
CBitmap m_cacheCBitmap;
cacheDc.CreateCompatibleDC(&dc);
m_cacheCBitmap.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
CBitmap *pOldBit = cacheDc.SelectObject(&m_cacheCBitmap);
//cacheDc.FillSolidRect(rc, RGB(255, 100, 255));
mdc->SelectObject(bmp[0]);
//dc.BitBlt(0, 0, rect->right, rect->bottom, mdc, 0, 0, SRCCOPY);
//在缓存dc 中绘制图像(在内存,未显示)
cacheDc.BitBlt(0, 0, rect->right, rect->bottom, mdc, 0, 0, SRCCOPY);
mdc->SelectObject(bmp[1]);
switch (mFrameNo)
{
case 0:
cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 49, 0, SRCAND);
cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 0, 0, SRCPAINT);
mFrameNo = 1;
break;
case 1:
cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 49, 154, SRCAND);
cacheDc.BitBlt(x, rect->bottom / 2 - 70, 49, 154, mdc, 0, 154, SRCPAINT);
mFrameNo = 0;
break;
default:
break;
}
//最后 将cacheDc中的图像绘制到显示器
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &cacheDc, 0, 0, SRCCOPY);
//释放对象
cacheDc.DeleteDC();
m_cacheCBitmap.DeleteObject();
}
双缓冲的使用:
1,先创建cacheDc
CDC cacheDc;
cacheDc.CreateCompatibleDC(&dc);
2,创建虚拟位图memBmp
(之后各种操作都是将其他位图绘制在这张虚拟位图上)
CBitmap m_cacheCBitmap;
3,创建适配位图
m_cacheCBitmap.CreateCompatibleBitmap(&dc, rc.Width(), rc.Height());
4,往缓存dc(cacheDc)绘制图片
(一般是很多张)
cacheDc.BltBit();
5,使用窗口dc,将缓存dc中的虚拟位图选取,绘制显示到窗口
dc.BitBlt(0, 0, rc.Width(), rc.Height(), &cacheDc, 0, 0, SRCCOPY);
总结:
由以上可以看出;双缓冲绘图是比单缓冲多了一次cacheDc
双缓冲技术使得多张位图以最终一张位图的形式刷到窗口,原本需要贴n次,现在只需要1次,自然解决了多图闪烁的问题。
推荐阅读