裝置上下文繪圖有很多種方法。例如通過建立位元影像畫刷,利用其填充一個地區來實現映像的繪製。此外,還可以使用CDC類的位元影像函數來輸出位元影像到裝置上下文中。
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 使用或運算組合源裝置地區顏色和目標裝置地區顏色 WHITENESS 使用白色填充目的地區域 |
StretchBlt與BitBlt不同在於StretchBlt方法能夠延伸或收縮位元影像以適應目的地區域的大小。格式如下:
BOOLStrevhBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,intnSrcWidth,int nSrcHeight,DWORD dwRop);
x:目標矩形地區的左上方x軸座標點。
y:目標矩形地區的左上方y軸座標點。
nWidth:在目標裝置中繪製位元影像的寬度。
nHight:在目標裝置中繪製位元影像的高度。
pSrcDC:源裝置上下文對象指標。
xSrc:源裝置上下文的起點x軸座標,函數從該起點複製位元影像到目標裝置。
ySrc:源裝置上下文的起點y軸座標,函數從該起點複製位元影像到目標裝置。
nSrcWidth;需要複製的位元影像寬度。
nSrcHeight;需要複製的位元影像高度。
dwRop:光柵作業碼。
下面是兩種方法對比程式,程式碼如下:
void CoutoutBmpView::OnDraw(CDC* pDC)
{
COutputBmpDoc* pDoc =GetDocument();//擷取文檔對象
ASSERT_VALID(pDoc);//驗證文檔對象
CDC memDC;//定義一個裝置上下文
memDC.CreateCompatibleDC(pDC);//建立相容的裝置上下文
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);//定義一個地區
CBrush brush(RGB(0,0,0));//定義一個黑色的畫刷
pDC->FrameRect(rc,&brush);//繪製矩形邊框
//只是用來觀察兩者區別的,繪製一個矩形框
rc.OffsetRect(220,0);//移動地區
//下邊是利用StretchBlt繪製的位元影像
BITMAP BitInfo;//定義位元影像結構
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();//釋放裝置上下文
bmp.DeleteObject();//釋放位元影像對象
}