CreateDIBitmap

CreateDIBitmap

CreateDIBitmap,該函數由與設備無關的點陣圖(DIB)創建與設備有關的點陣圖(DDB),並且有選擇地為點陣圖置位。

函數功能


該函數由與設備無關的點陣圖(DIB)創建與設備有關的點陣圖(DDB),並且有選擇地為點陣圖置位。

函數原型


HBITMAP CreateDIBitmap(HDC hdc,CONST BITMAPINFOHEADER *lpbmih,DWORD fdwlnit,CONST VOID *lpblnit,CONST BITMAPINFO *lpbmi,UINT fuUsage);
參數:
hdc:設備環境句柄。
lpbmih:指向點陣圖信息頭結構的指針,它可以是下列操作系統點陣圖信息頭之一:
Windows NT 3.51和早期:BITMAPINFOHEADER;Windows NT 4.0和Windows 95:BITMAPV4HEADER;
Windows NT 5.0和Windows 98:BITMAPV5HEADER。
如果fdwlnit是CBM_INIT,那麼函數使用點陣圖信息頭結構來獲取點陣圖所需的寬度、高度以及其他信息。
注意高度若是正數,那麼表示是自底向上DIB,而負數表示為自頂向下DIB,這種情況與CreateDIBitmap函數兼容。
Fdwlnit:位標識集。它指定系統如何對點陣圖的位進行初始化。

標誌


下面是定義的位標誌常量:
CBM_INIT:如果設置了該標誌,那麼系統將使用lpblnit和lpbmi兩個參數指向的數據來對點陣圖中的位進行初始化。如果沒有該標誌,那麼表示上述兩個參數指向的數據無效。如果fdwlnit為0,那麼系統不會對點陣圖的位進行初始化。
lpblnit:該指針指向包含初始的點陣圖數據的位元組類型數組。數據格式與參數lpbmi指向的BITMAPINFO結構中的成員biBitCount有關。
lpbmi:指向BITMAPINFO結構的旨針。該結構描述了參數lpbmi指向的數組的維數和顏色格式。
fuUsage:表示BITMAPINFO結構的成員bmiColors是否初始化過,並且如果是,那麼bmiColors是否包含明確的紅、綠、藍(RGB)值或調色板索引。參數fuUsage必須取下列值中的一個,這些值的含義為:
DIB_PAL_COLORS:表示提供一個顏色表,並且該表由該點陣圖要選入的設備環境的邏輯調色板的16位索引值數組組成。
DIB_RGB_COLORS:表示提供一個顏色表,並且表中包含了原義的RGB值。
返回值:如果函數執行成功,返回值則是創建的點陣圖的句柄;如果函數執行失敗,那麼返回值為NULL,若想獲取更多錯誤信息,請調用GetLastError函數。
備註:用於fdwlnit參數的CBM_CREATDIB標誌不再被支持。當不再需要該點陣圖時,可調用DeleteObject函數刪除它。
ICM:參數fuUsage用來指定參數lpbmi指向的BITMAPINFO結構中的成員bmiColors是否包含顏色信息。如果bmiColors不包含顏色信息,那麼不能進行點陣圖的顏色管理。BITMAPINFO中的bmiColors成員必須包含BITMAPV4HEADER或BITMAPV5HEADER,以便能夠進行顏色管理。在創建完點陣圖之後,產生的點陣圖的內容顏色不匹配。
速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:不支持;頭文件:wingdi.h;庫文件:gdi32.lib。

示例


從一個文件中讀取DDB數據然後用進行轉換
HBITMAP LoadBitmapEx(LPCTSTR lpszFile)
{
if(lpszFile == NULL)
return NULL;
HBITMAP hBitmap;
HANDLE hf;
BITMAPFILEHEADER* pbmfh;
DWORD dwBytesRead, dwFileSize, dwFileSizeHigh;
BOOL bSuccess;
// 打開一個bmp文件
hf = CreateFile(lpszFile, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if( hf == INVALID_HANDLE_VALUE)
{
TRACE("Open file filed with error %d ", GetLastError());
return NULL;
}
// 得到這個文件大小
dwFileSize = GetFileSize(hf, &dwFileSizeHigh);
if( dwFileSizeHigh )
{
return NULL;
}
// 分配內存,大小為該文件的大小
pbmfh = (BITMAPFILEHEADER*)malloc(dwFileSize);
if( !pbmfh )
{
CloseHandle(hf);
return NULL;
}
// 讀取數據
bSuccess = ReadFile(hf, pbmfh, dwFileSize, &dwBytesRead, NULL);
CloseHandle(hf);
// 效驗文件大小和文件格式
if( !bSuccess || dwFileSize != dwBytesRead
|| pbmfh->bfType != 0x4D42 || pbmfh->bfSize != dwFileSize)
{
free((void*)pbmfh);
return NULL;
}
// 進行DIB轉換
hBitmap = CreateDIBitmap(
GetWindowDC(NULL),
(BITMAPINFOHEADER*)(pbmfh + 1),
CBM_INIT,
(BYTE*)pbmfh + pbmfh->bfOffBits,
(BITMAPINFO*)(pbmfh + 1),
DIB_RGB_COLORS);
free((void*)pbmfh);
return hBitmap;
}