CreateDIBSection

CreateDIBSection

創建應用程序可以直接寫入的、與設備無關的點陣圖(DIB)的函數

簡介


該函數提供一個指針,該指針指向點陣圖位數據值的地方。可以給文件映射對象提供句柄,函數使用文件映射對象來創建點陣圖,或者讓系統為點陣圖分配內存。
函數原型:HBITMAP CreateDIBSection(HDC hdc,CONST BITMAPINFO *pbmi,UINT iUsage,VOID** ppvBits,HANDLE hSection,DWORD dwOffset);
參數:
hdc:設備環境句柄。如果iUsage的值是DIB_PAL_COLORS,那麼函數使用該設備環境的邏輯調色板對與設備無關點陣圖的顏色進行初始化。
pbmi:指向BITMAPINFO結構的指針,該結構指定了與設備無關點陣圖的各種屬性,其中包括點陣圖的維數和顏色。
iUsage:指定由pbmi參數指定的BITMAPINFO結構中的成員bmiColors數組包含的數據類型(要麼是邏輯調色板索引值,要麼是原文的RGB值)。下列值是系統定義的,其含義為:
DIB_PAL_COLORS:表示成員bmiColors是hdc指定的設備環境的邏輯調色板,使用的是16位索引值數組。
DIB_RGB_COLORS:表示結構BITMAPINFO中包含了RGB值的數組。
ppvBits:指向一個變數的指針,該變數接收一個指向DIB位數據值的指針。
hSection:文件映射對象的句柄。函數將使用該對象來創建DIB(與設備無關點陣圖)。該參數可以是NULL
如果hSection不是NULL,那麼它一定是文件映射對象的句柄。該對象是通過調用帶有PAGE_READWRITE或PAGE_WRITECOPY標誌的CreateFileMapping函數創建的。不支持只讀的DIB類型。通過其他方法創建的句柄將會引起CreateDIBSection函數執行失敗。
如果hSection不是NULL,那麼函數CreateDIBSection將在hSection引用的文件映射對象中偏移量為dwOffset處獲取點陣圖的位數據值。應用程序可以在以後通過調用GetObject函數來檢索hSection句柄,其中GetObject函數使用了GreateDIBSection函數返回的GBITMAP類型的對象。
如果hSection為NULL,那麼系統將為與設備無關點陣圖(DIB)分配內存。在這種情況下,函數CreateDIBSection將忽略參數dwOffset,應用程序無法在以後獲取指向內存的句柄。通過調用GetObject函數來填充的DIBSECTION結構成員dshSection也將成為NULL。
DwOffset:指定從hSection引用的文件映射對象開始處算起的偏移量,超過這個偏移量的地方就是點陣圖的位數據值開始存放的地方。在hSection為NULL時忽略該值。點陣圖的位數據值是以DWORD為單位計算的。
返回值:如果函數執行成功,那麼返回值是一個指向剛剛創建的與設備無關點陣圖的句柄,並且*ppvBits指向該點陣圖的位數據值;如果函數執行失敗,那麼返回值為NULL,並且*ppvBit也為NULL,若想獲得更多錯誤信息,請調用GetLastError函數。

備註


正如上面提到過,如果hSection為NULL,那麼系統為DIB分配內存。當以後通過調用DeleteObject函數刪除該DIB時,系統將關閉指向相應內存的句柄。如果Hsection不為NULL,那麼在調用DeleteObject刪除該點陣圖之後,必須自己關閉hSection內存句柄。
Windows NT:需要保證GDI子系統在自己繪製點陣圖之前已經完成所有由創建的點陣圖。訪問點陣圖應該是同時的。這可以調用函數來進行。其適用於任何指向點陣圖的位數據值指針的情況,也包括在調用象這樣的函數時傳送指針的情形。
:如果(由參數指向)結構成員不包含或,那麼不進行顏色管理。否則,允許有顏色管理,並且有與該點陣圖有關的特定的顏色空間。
:參數要設為。除非使用的是點陣圖。在這種情況下,應設為。然而,如果使用了,操作系統將忽略結構成員數組中的值。另外,應將參數設為,忽略參數,可將它設為0。
在版中,由參數指向的結構必定規定每像素點為1或2位。
在版中,如果圖像是調色板模式(通常是1,2,4和8格式)的,那麼結構中必須包括顏色表。對於或非調色板式的圖像,顏色表必須是項長度,這項必須指定紅、綠和藍3色的位掩碼值。對於圖像,將忽略顏色表,其像素必須按(BGR)格式存儲。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;頭文件:wingdi.h;庫文件:gdi32.lib。
VC++ 代碼實例:
_compDC=CreateCompatibleDC(hDC);
setbih(iWidth, iHeight);
BITMAPINFO bi;
bi.bmiHeader=bih;
hBitmap=CreateDIBSection(hDC, &bi, DIB_RGB_COLORS, (void**)&_pbuffer, NULL, 0);
if(!hBitmap) return 0;
_OldBmp=SelectObject(_compDC, hBitmap);
BitBlt(_compDC, 0, 0, iWidth, iHeight, hDC, iLeft, iTop, SRCCOPY);
SelectObject(_compDC, _OldBmp);
DeleteDC(_compDC);