使用windows的的自帶的函數來顯示圖像可能始終還是繞不開兩個概念,
視口和窗口。
視口--- 屏幕上的一個顯示用的矩形框。
窗口--- 完整圖像上的一個用於取數的矩形框。
屏幕的寬度、高度和視口參數用於控制向顯示存儲器中寫數。
圖像的寬度、高度和窗口參數用於控制從圖像文件中取數。
利用DrawDibDraw函數可以實現視頻顯示和單幀圖像的顯示,而且對於顯示圖像的移動和放縮,也可以輕松實現。但是在實際的顯示中可能都會把屏幕的概念利用GetClientRect()換成客戶區。因為圖像總是在客戶區進行顯示。為了讓圖像正常顯示(即不經過縮放),那么窗口的大小必定和視口的大小是完全相同的,只是窗口的起始點和視口的起始點坐標標准是不一樣的,所以這兩點坐標顯然是不一樣的。
例如rc即為我們設的客戶區的CRect類的對象,這里我們假設視口的大小等於客戶區的大小。
DrawDibDraw(m_hDrawDib,
m_hDC,
//視口
rc.left,//目的圖像的橫坐標在客戶區的橫坐標起始,視口的橫坐標起始
rc.top,//目的圖像的縱坐標在客戶區的縱坐標起始,視口的縱坐標起始
rc.Width(),//目的圖像的寬度,視口的圖像寬度
rc.Height(),//目的圖像的高度,視口的圖像高度
&(m_pBmpInfo->bmiHeader),
m_pSourceDat,//整幅圖像的數據起始首地址
//窗口
dxs,//源圖像的橫坐標起始,窗口橫坐標起始
dys,//源圖像的縱坐標起始,窗口縱坐標起始
rc.Width(),//源圖像的寬度,窗口寬度
rc.Height(),//源圖像的高度,窗口高度
0);
這樣就可以正常顯示一副圖像了,而且隨着dxs和dys的改變,可以改變窗口取數的位置,從而顯示的是移動后的圖像。
DrawDibDraw
這個函數將DIB繪至屏幕。
BOOL DrawDibDraw(
HDRAWDIB hdd,
HDC hdc,
int xDst,
int yDst,
int dxDst,
int dyDst,
LPBITMAPINFOHEADER lpbi,
LPVOID lpBits,
int xSrc,
int ySrc,
int dxSrc,
int dySrc,
UINT wFlags
);
參數
hdd DrawDib DC的句柄。
hdc DC的句柄。
xDst和yDst 在MM_TEXT坐標系,目標矩形左上角的x和y坐標。
dxDst和dyDst 在MM_TEXT坐標系下,目標矩形的寬度和高度。如果dxDst為-1,則使用位圖的寬度;如果dyDst為-1,則使用位圖的高度。
lpbi 包含圖象格式的BITMAPINFOHEADER結構的地址。DIB的顏色表緊跟着格式后,並且biHeight成員必須為正值;DrawDibDraw不能繪制倒置的DIB。
lpbits 包含位圖位的緩沖的地址。
xSrc和ySrc 以象素為單位,源矩形左上角的x和y坐標。坐標(0,0)是位圖的左上角。
dxSrc和dySrc 以象素為單位,源矩形的寬度和高度。
wFlags 可用的繪圖標志。如下值被定義:
DDF_BACKGROUNDPAL 實現作為背景的調色板,保留當前顯示所使用的調色板不變。這個值只有當DDF_SAME_HDC未被設置時才有效。
DDF_DONTDRAW 當前圖象已解壓但未繪。這個標志取代了DDF_PREROLL標志。
DDF_FULLSCREEN 不被支持。
DDF_HALFTONE 不管DIB的調色板如何而把DIB抖動成標准調色板。如果應用程序使用了DrawDibBegin,在DrawDibBegin中設置而不在DrawDibDraw中。
DDF_HURRYUP 數據並不需要被繪(它可以被繪)並且DDF_UPDATE不用理會這個信息。DrawDib只有當需要去構建另一幀時才檢查這個值;否則,這個值被忽略。
這個值通常用來同步視頻和音頻。當同步數據時,應用程序應當用這個值發送圖象以防止驅動器需要緩沖幀來解壓后續幀。
DDF_NOTKEYFRAME DIB數據不是關鍵幀。
DDF_SAME_HDC 使用當前DC句柄以及與當前句柄相關聯的調色板。
DDF_SAME_DRAW 讓DrawDibDraw使用當前的繪制參數。只有當從使用DrawDibDraw或DrawDibBegin起,lpbi、dxDext、dyDest、dxSrc和dySrc就未改變才用這個值。DrawDibDraw經常檢查這些參數,如果它們改變了,DrawDibBegin則准備繪圖的DrawDib DC。這個標志取代了DDF_SAME_DIB和DDF_SAME_SIZE標志。
DDF_UPDATE 最后緩存的圖象需要繪制。如果用這個值繪制失敗,則緩沖的圖象不在有效,並且在顯示被更新前,需要指定一幅新的圖象。
返回值
成功返回TRUE,否則FALSE。
注 DDF_DONTDRAW使DrawDibDraw解壓但不顯示一幅圖象。一個調用DrawDibDraw的序列是指定DDF_UPDATE來顯示圖象。
如果DrawDib DC沒有指定一個屏幕緩沖,指定DDF_DONTDRAW會造成這幀被立即繪到屏幕。序列調用DrawDibDraw指定DDF_UPDATE會失敗。
盡管DDF_UPDAT和DDF_DONTDRAW可以在不同時間設置,它們可以一起用來創建脫屏圖象。當脫屏圖象完成后,可以調用DrawDibDraw來顯示圖象。