欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(四)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次,自然解决了多图闪烁的问题。