CreateDIBitmap

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

基本介紹

  • 中文名:CreateDIBitmap
  • 函式功能:有選擇地為點陣圖置位
  • 函式原型:HBITMAP CreateDIBitmap(
  • hdc:設備環境句柄
  • Fdwlnit:位標識集
函式原型,標誌,示例,

函式原型

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 )
{
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;
}

相關詞條

熱門詞條

聯絡我們