基本介紹
- 中文名:CreateDIBitmap
- 函式功能:有選擇地為點陣圖置位
- 函式原型:HBITMAP CreateDIBitmap(
- hdc:設備環境句柄
- Fdwlnit:位標識集
函式原型,標誌,示例,
函式原型
HBITMAP CreateDIBitmap(HDC hdc,CONST BITMAPINFOHEADER *lpbmih,DWORD fdwlnit,CONST VOID *lpblnit,CONST BITMAPINFO *lpbmi,UINT fuUsage);
參數:
hdc:設備環境句柄。
Windows NT 3.51和早期:BITMAPINFOHEADER;Windows NT 4.0和Windows 95:BITMAPV4HEADER;
Windows NT 5.0和Windows 98:BITMAPV5HEADER。
注意高度若是正數,那么表示是自底向上DIB,而負數表示為自頂向下DIB,這種情況與CreateDIBitmap函式兼容。
Fdwlnit:位標識集。它指定系統如何對點陣圖的位進行初始化。
標誌
下面是定義的位標誌常量:
CBM_INIT:如果設定了該標誌,那么系統將使用lpblnit和lpbmi兩個參數指向的數據來對點陣圖中的位進行初始化。如果沒有該標誌,那么表示上述兩個參數指向的數據無效。如果fdwlnit為0,那么系統不會對點陣圖的位進行初始化。
lpbmi:指向BITMAPINFO結構的指針。該結構描述了參數lpbmi指向的數組的維數和顏色格式。
fuUsage:表示BITMAPINFO結構的成員bmiColors是否初始化過,並且如果是,那么bmiColors是否包含明確的紅、綠、藍(RGB)值或調色板索引。參數fuUsage必須取下列值中的一個,這些值的含義為:
DIB_PAL_COLORS:表示提供一個顏色表,並且該表由該點陣圖要選入的設備環境的邏輯調色板的16位索引值數組組成。
DIB_RGB_COLORS:表示提供一個顏色表,並且表中包含了原義的RGB值。
備註:用於fdwlnit參數的CBM_CREATDIB標誌不再被支持。當不再需要該點陣圖時,可調用DeleteObject函式刪除它。
速查: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 )
{
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;
}