標籤:style color strong width io cti
StretchBlt和BitBlt都用在雙緩衝視圖中,用來顯示一幅映像
一、StretchBlt
函數從源矩形中複製一個位元影像到目標矩形,必要時按目標裝置設定的模式進行映像的展開或壓縮。也即是將記憶體中的位元影像拷貝到螢幕上,並且可以根據螢幕畫圖區的大小來進行伸縮,適應響應的螢幕(或影像控制)
BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );
x:邏輯單元x軸左上方座標; (擷取影像控制的DC後,該值一般設為 0 )
y:邏輯單元y軸左上方座標; (擷取影像控制的DC後,該值一般設為 0 ) nWidth: 裝置矩形寬度;
(即是影像控制的寬度,通過int rcWidth = rc.right - rc.left;來獲得,rc為儲存了影像控制矩形區座標資訊)nHeight:裝置矩形高度;
(即是影像控制的高度,通過int rcHeight = rc.bottom - rc.top;來獲得)pSrcDC: 源裝置上下文;
(就是我們定義的記憶體DC,然後取地址)xSrc :源矩形
x軸左上方座標; (一般都是整幅圖片拷貝,所以該值為 0 )ySrc: 源矩形y
軸左上方座標; (一般都是整幅圖片拷貝,所以該值為 0 )Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle.nSrcWidth:源矩形寬度;
(如果我們定義了一個結構體BITMAP類型m_bmp儲存位元影像資訊,那麼可以用m_bmp.bmWidth擷取寬度)nSrcHeight:源矩形高度
( 如果我們定義了一個結構體BITMAP類型m_bmp儲存位元影像資訊,那麼可以用m_bmp.bmHeight擷取寬度)dwRop:指定要進行的光柵操作。
(這個有很多選擇,我們一般選擇SRCCOPY:將源矩形地區直接拷貝到目標矩形地區。)
二、BitBlt函數
該函數對指定的源裝置環境地區中的像素進行位塊(bit_block)轉換,以傳送到目標裝置環境。
CDC::BitBlt
BOOL BitBlt( int x, inty, int nWidth, int nHeight, CDC*pSrcDC, int xSrc, int ySrc, DWORDdwRop );
BitBlt函數和上面的STretchBlt函數的參數基本上差不多,只是少了倒數第二個和倒數第三個參數:
nSrcWidth:源矩形寬度; 以及,nSrcHeight:源矩形高度
前面四個參數也是和目標矩形(也即是我們的影像控制地區)相關的,如果是影像控制的話,起點座標也是(0,0),終點座標就是矩形區的寬度和高度;
對於源矩形地區(指記憶體DC中的位元影像),只需要給出拷貝的起點即可,
BitBlt函數不會對原來的位元影像進行展開或壓縮,只會根據我們給定的nWidth,nHeight 值來決定該有多少部分進行顯示
下面一段代碼給出了這兩個函數的具體用法:
void CEnvirMonibeta1View::ShowBitmap(CDC *pDC, CString TotalName, const RECT &rc)
{
//顯示圖片函數LoadImage 根據位元影像(或圖片)的全路徑名TotalName載入圖片
HBITMAP m_hBitmap;
m_hBitmap = (HBITMAP) LoadImage(NULL,TotalName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);
// 之前在類中定義了一個CBitmap 類的對象m_bitmap,
if( m_bitmap.m_hObject )
{
m_bitmap.Detach(); //m_bitmap為建立的位元影像對象
}
m_bitmap.Attach(m_hBitmap); // 讓位元影像對象m_bitmap 和我們載入的位元影像相關聯(載入進來的位元影像只要提供一個位元影像控制代碼就可以)
//定義並建立一個記憶體裝置環境
CDC m_dcMemory;
if( !m_dcMemory.CreateCompatibleDC(pDC) ) //建立相容性的DC
return;
//定義一個位元影像結構體,將圖片資訊儲存在位元影像結構體中
BITMAP bitmap;
m_bitmap.GetBitmap(&bitmap);
CBitmap *pbmpOld = NULL;
m_dcMemory.SelectObject(&m_bitmap); //將位元影像選入臨時記憶體裝置環境
//擷取螢幕畫圖地區(影像控制)的寬度和高度
int rcWidth = rc.right - rc.left;
int rcHeight = rc.bottom - rc.top;
//圖片顯示調用函數BitBlt
pDC->BitBlt(0,0,rcWidth,rcHeight,&dcBmp,0,0,SRCCOPY);
// 如果希望圖片和矩形地區能自動適配,可以用下面的函數
// pDC->StretchBlt(0,0,rcWidth,rcHeight,&dcBmp,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);
//下面是一些善後工作
dcBmp.SelectObject(pbmpOld); //恢複臨時DC的位元影像
DeleteObject(&m_bitmap);//刪除位元圖
dcBmp.DeleteDC();//刪除後台DC
// Invalidate(); //一直調用OnDraw顯示圖片
}