1. 程式人生 > >(四)MFC學習之雙緩衝貼圖

(四)MFC學習之雙緩衝貼圖

何為雙緩衝?

雙緩衝自然是相對一般的單緩衝而言的,

單緩衝

那麼先從單緩衝開始吧,先上程式碼((二)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次,自然解決了多圖閃爍的問題。