您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關StretchBlt函數(shù)和BitBlt函數(shù)怎么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
StretchBlt和BitBlt都用在雙緩沖視圖中,用來顯示一幅圖像
函數(shù)從源矩形中復制一個位圖到目標矩形,必要時按目標設備設置的模式進行圖像的拉伸或壓縮。也即是將內(nèi)存中的位圖拷貝到屏幕上,并且可以根據(jù)屏幕畫圖區(qū)的大小來進行伸縮,適應響應的屏幕(或圖像控件)
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為保存了圖像控件矩形區(qū)坐標信息)
nHeight:設備矩形高度; (即是圖像控件的高度,通過int rcHeight = rc.bottom - rc.top;來獲得)
pSrcDC: 源設備上下文; (就是我們定義的內(nèi)存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:將源矩形區(qū)域直接拷貝到目標矩形區(qū)域。)
該函數(shù)對指定的源設備環(huán)境區(qū)域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環(huán)境。
CDC::BitBlt
BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );
BitBlt函數(shù)和上面的STretchBlt函數(shù)的參數(shù)基本上差不多,只是少了倒數(shù)第二個和倒數(shù)第三個參數(shù):
nSrcWidth:
源矩形寬度;
nSrcHeight:源矩形高度
前面四個參數(shù)也是和目標矩形(也即是我們的圖像控件區(qū)域)相關的,如果是圖像控件的話,起點坐標也是(0,0),終點坐標就是矩形區(qū)的寬度和高度;
對于源矩形區(qū)域(指內(nèi)存DC中的位圖),只需要給出拷貝的起點即可,
BitBlt函數(shù)不會對原來的位圖進行拉伸或壓縮,只會根據(jù)我們給定的nWidth,nHeight 值來決定該有多少部分進行顯示
下面一段代碼給出了這兩個函數(shù)的具體用法:
void CEnvirMonibeta1View::ShowBitmap(CDC *pDC, CString TotalName, const RECT &rc) { //顯示圖片函數(shù)LoadImage 根據(jù)位圖(或圖片)的全路徑名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為創(chuàng)建的位圖對象 } m_bitmap.Attach(m_hBitmap); // 讓位圖對象m_bitmap 和我們加載的位圖相關聯(lián)(加載進來的位圖只要提供一個位圖句柄就可以) //定義并創(chuàng)建一個內(nèi)存設備環(huán)境 CDC m_dcMemory; if( !m_dcMemory.CreateCompatibleDC(pDC) ) //創(chuàng)建兼容性的DC return; //定義一個位圖結構體,將圖片信息保存在位圖結構體中 BITMAP bitmap; m_bitmap.GetBitmap(&bitmap); CBitmap *pbmpOld = NULL; m_dcMemory.SelectObject(&m_bitmap); //將位圖選入臨時內(nèi)存設備環(huán)境 //獲取屏幕畫圖區(qū)域(圖像控件)的寬度和高度 int rcWidth = rc.right - rc.left; int rcHeight = rc.bottom - rc.top; //圖片顯示調(diào)用函數(shù)BitBlt pDC->BitBlt(0,0,rcWidth,rcHeight,&dcBmp,0,0,SRCCOPY); // 如果希望圖片和矩形區(qū)域能自動適配,可以用下面的函數(shù) // 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(); //一直調(diào)用OnDraw顯示圖片 }
關于“StretchBlt函數(shù)和BitBlt函數(shù)怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。