StretchBlt函數和BitBlt函數的用法

來源:互聯網
上載者:User

標籤: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顯示圖片


}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.