天天看點

Cimage下實作雙緩沖繪圖

雙緩沖即在記憶體中建立一個與螢幕繪圖區域一緻的對象,先将圖形繪制到記憶體中的這個對象上,再一次性将這個對象上的圖形拷貝到螢幕上,這樣能大大加快繪圖的速度。

雙緩沖繪圖的步驟:

1、在記憶體中建立與畫布一緻的緩沖區

2、在緩沖區畫圖

3、将緩沖區位圖拷貝到目前畫布上

4、釋放記憶體緩沖區

雙緩沖繪圖的代碼實作(在MFC下):

void CMFCApplication1View::OnDraw(CDC* pDC)
{
	CMFCApplication1Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

//擷取螢幕的矩形
	CRect rectClient;
	GetClientRect(rectClient);

     //雙緩沖繪圖的實作
	CDC MDC;
	MDC.CreateCompatibleDC(pDC);        //建立相容的DC
	CBitmap bmp;
	bmp.CreateCompatibleBitmap(pDC, rectClient.Width(), rectClient.Height());        //建立相容的圖檔
	MDC.SelectObject(bmp);

    //将圖檔畫到記憶體中
	m_bmpBack.Draw(MDC, rectClient);    
	
	//将記憶體中的内容拷貝到畫布上
	pDC->BitBlt(0, 0, rectClient.Width(), rectClient.Height(), &MDC, 0, 0, SRCCOPY); 
	
	ReleaseDC(pDC);
}
           

這是關于BitBlt的一些介紹

BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);

x:目标矩形區域的左上角x軸坐标點。

y:目标矩形區域的左上角y軸坐标點。

nWidth:在目标裝置中繪制位圖的寬度。

nHight:在目标裝置中繪制位圖的高度。

pSrcDC:源裝置上下文對象指針。

xSrc:源裝置上下文的起點x軸坐标,函數從該起點複制位圖到目标裝置。

ySrc:源裝置上下文的起點y軸坐标,函數從該起點複制位圖到目标裝置。

dwRop:光栅操作代碼

dwRop有如下選擇:

BLACKNESS 使用黑色填充目标區域

DSTINVERT 目标矩陣區域顔色取反

MERGECOPY 使用與運算組合原裝置矩形區域的顔色和目标裝置的畫刷

MERGEPAINT 使用或運算将反向的源矩形區域的顔色和目标矩形區域的顔色合并

NOTSRCCOPY 複制源裝置區域的反色到目标裝置中

NOTSRCERASE 使用或運算組合源裝置區域與目标裝置區域的顔色,然後對結果顔色取反

PATCOPY 複制源裝置目前選中的畫刷到目标裝置

PATINVERT 使用異或運算組合目标裝置選中的畫刷和目标裝置區域的顔色

PATPAINT 通過或運算組合目标區域目前選中的畫刷和源裝置區域反轉的顔色

SRCAND 使用與運算組合源裝置和目标裝置區域的顔色

SRCCOPY 直接複制源裝置區域到目标裝置中

SRCERASE 使用與運算組合目标裝置區域的反色與源裝置區域的顔色

SRCINVERT 使用異或運算組合源裝置區域顔色和目标裝置區域顔色

SRCPAINT 使用或運算組合源裝置區域顔色和目标裝置區域顔色