【MFC】BitBlt详解
設(shè)備上下文繪圖有很多種方法。例如通過創(chuàng)建位圖畫刷,利用其填充一個(gè)區(qū)域來實(shí)現(xiàn)圖像的繪制。此外,還可以使用CDC類的位圖函數(shù)來輸出位圖到設(shè)備上下文中。
BitBlt 用于從原設(shè)備中復(fù)制位圖到目標(biāo)設(shè)備,語法格式如下:
BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);
x:目標(biāo)矩形區(qū)域的左上角x軸坐標(biāo)點(diǎn)。
y:目標(biāo)矩形區(qū)域的左上角y軸坐標(biāo)點(diǎn)。
nWidth:在目標(biāo)設(shè)備中繪制位圖的寬度。
nHight:在目標(biāo)設(shè)備中繪制位圖的高度。
pSrcDC:源設(shè)備上下文對象指針。
xSrc:源設(shè)備上下文的起點(diǎn)x軸坐標(biāo),函數(shù)從該起點(diǎn)復(fù)制位圖到目標(biāo)設(shè)備。
ySrc:源設(shè)備上下文的起點(diǎn)y軸坐標(biāo),函數(shù)從該起點(diǎn)復(fù)制位圖到目標(biāo)設(shè)備。
dwRop:光柵操作代碼
| ? |
| BLACKNESS?? ??????? 使用黑色填充目標(biāo)區(qū)域 DSTINVERT????????????? 目標(biāo)矩陣區(qū)域顏色取反 MERGECOPY??????????? 使用與運(yùn)算組合原設(shè)備矩形區(qū)域的顏色和目標(biāo)設(shè)備的畫刷 MERGEPAINT?????????? 使用或運(yùn)算將反向的源矩形區(qū)域的顏色和目標(biāo)矩形區(qū)域的顏色合并 NOTSRCCOPY????????? 復(fù)制源設(shè)備區(qū)域的反色到目標(biāo)設(shè)備中 NOTSRCERASE??????? 使用或運(yùn)算組合源設(shè)備區(qū)域與目標(biāo)設(shè)備區(qū)域的顏色,然后對結(jié)果顏色取反 PATCOPY????????????????? 復(fù)制源設(shè)備當(dāng)前選中的畫刷到目標(biāo)設(shè)備 PATINVERT?????????????? 使用異或運(yùn)算組合目標(biāo)設(shè)備選中的畫刷和目標(biāo)設(shè)備區(qū)域的顏色 PATPAINT???????????????? 通過或運(yùn)算組合目標(biāo)區(qū)域當(dāng)前選中的畫刷和源設(shè)備區(qū)域反轉(zhuǎn)的顏色 SRCAND?????????????????? 使用與運(yùn)算組合源設(shè)備和目標(biāo)設(shè)備區(qū)域的顏色 SRCCOPY???????????????? 直接復(fù)制源設(shè)備區(qū)域到目標(biāo)設(shè)備中 SRCERASE?????????????? 使用與運(yùn)算組合目標(biāo)設(shè)備區(qū)域的反色與源設(shè)備區(qū)域的顏色 SRCINVERT????????????? 使用異或運(yùn)算組合源設(shè)備區(qū)域顏色和目標(biāo)設(shè)備區(qū)域顏色 SRCPAINT???????????????? 使用或運(yùn)算組合源設(shè)備區(qū)域顏色和目標(biāo)設(shè)備區(qū)域顏色 WHITENESS???????????? 使用白色填充目標(biāo)區(qū)域 |
BOOLStrevhBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,intnSrcWidth,int nSrcHeight,DWORD dwRop);
?
x:目標(biāo)矩形區(qū)域的左上角x軸坐標(biāo)點(diǎn)。
y:目標(biāo)矩形區(qū)域的左上角y軸坐標(biāo)點(diǎn)。
nWidth:在目標(biāo)設(shè)備中繪制位圖的寬度。
nHight:在目標(biāo)設(shè)備中繪制位圖的高度。
pSrcDC:源設(shè)備上下文對象指針。
xSrc:源設(shè)備上下文的起點(diǎn)x軸坐標(biāo),函數(shù)從該起點(diǎn)復(fù)制位圖到目標(biāo)設(shè)備。
ySrc:源設(shè)備上下文的起點(diǎn)y軸坐標(biāo),函數(shù)從該起點(diǎn)復(fù)制位圖到目標(biāo)設(shè)備。
nSrcWidth;需要復(fù)制的位圖寬度。
nSrcHeight;需要復(fù)制的位圖高度。
dwRop:光柵操作代碼。
?
?
下面是兩種方法對比程序,程序代碼如下:
void CoutoutBmpView::OnDraw(CDC* pDC)
{
???? COutputBmpDoc* pDoc =GetDocument();//獲取文檔對象
???? ASSERT_VALID(pDoc);//驗(yàn)證文檔對象
???? CDC memDC;//定義一個(gè)設(shè)備上下文
???? memDC.CreateCompatibleDC(pDC);//創(chuàng)建兼容的設(shè)備上下文
???? CBitmap bmp;//定義位圖對象
???? bmp.LoadBitmap(IDB_BKBITMAP);//加載位圖
???? memDC.SelectObject(&bmp);//選中位圖對象
???? pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//繪制位圖
???? //以上是利用BitBlt來繪制位圖
???? CRect rc(30,20,210,200);//定義一個(gè)區(qū)域
???? CBrush brush(RGB(0,0,0));//定義一個(gè)黑色的畫刷
???? pDC->FrameRect(rc,&brush);//繪制矩形邊框
???? //只是用來觀察兩者區(qū)別的,繪制一個(gè)矩形框
???? rc.OffsetRect(220,0);//移動區(qū)域
//下邊是利用StretchBlt繪制的位圖
???? BITMAP BitInfo;//定義位圖結(jié)構(gòu)
???? bmp.GetBitmap(&BitInfo);//獲取位圖信息
???? int x = BitInfo.bmWidth;//獲取位圖寬度
???? int y = BitInfo.bmHeight;獲取位圖高度
???? pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);//繪制位圖
???? pDC->FrameRect(rc,&brush);//繪制邊框
???? brush.DeleteObject();//釋放畫刷
???? memDC.DeleteDC();//釋放設(shè)備上下文
???? bmp.DeleteObject();//釋放位圖對象
}
轉(zhuǎn)載于:https://www.cnblogs.com/zhangq/p/4204300.html
總結(jié)
以上是生活随笔為你收集整理的【MFC】BitBlt详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入探讨this指针
- 下一篇: 没有事业的女朋友(一个老总的感言)