複製鏈接
請複製以下鏈接發送給好友

CreateDIBitmap

鎖定
CreateDIBitmap函數由與設備無關的位圖DIB)創建與設備有關的位圖(DDB),並且有選擇地為位圖置位。
中文名
CreateDIBitmap
函數功能
有選擇地為位圖置位
函數原型
HBITMAP CreateDIBitmap(
hdc
設備環境句柄
Fdwlnit
位標識集

目錄

CreateDIBitmap函數原型

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:位標識集。它指定系統如何對位圖的位進行初始化。

CreateDIBitmap標誌

下面是定義的位標誌常量
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。

CreateDIBitmap示例

從一個文件中讀取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 )
{
CloseHandle(hf);
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;
}