簡介
該函式提供一個指針,該指針指向點陣圖位數據值的地方。可以給檔案映射對象提供句柄,函式使用檔案映射對象來創建點陣圖,或者讓系統為點陣圖分配記憶體。
函式原型: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);