首先,你可以不必把DIB轉換成DDB就可以讓它顯示在設備上。但是那樣的話,你都會看見會程序運行得有多慢了,而且你也不能使用一些有關DDB操作的函數功能了,諸如BitBlt()....
以下是從DIB創建一個DDB的基本步驟:
1.從DIB顏色表信息中的信息可以創建一個邏輯調色板,如果設備支持的話,你只需要做這一步。為了創建一個調色板,就需要分配給邏輯調色板結構。初始化palversion和palnumentries,從DIB中的顏色表把顏色數拷貝過來。然後我們就可以使用createpalette()函數來使用我們初始化的邏輯調色板了。
2.把邏輯調色板選到設備中,然後實現它。
3.創建DDB,可以使用createdibbitmap()函數。
4.最後不要忘記釋放掉分給邏輯調色板結構的內存。
雖然這樣就可以創建一個邏輯調色板了,但它沒有返回信息給所調用的程序代碼。如果DIB描述的是一個256色的位圖的話,而且設備也只支持256色,那麼DDB可能就不能正確的顯示在設備上。那是因為系統使用的顏色數與位圖的顏色數不相同,因此,你要修改一下,在我們畫位圖之前,就讓它返回邏輯調色板,然後我們選擇和實現它到設備的上下文。
//以下是程序代碼
hbitmap dibtoddb( handle hdib )
{
lpbitmapinfoheader lpbi;
hbitmap hbm;
cpalette pal;
cpalette* poldpal;
cclientdc dc(null);
if (hdib == null)
return null;
lpbi = (lpbitmapinfoheader)hdib;
int ncolors = lpbi->biclrused ? lpbi->biclrused :
1 << lpbi->bibitcount;
bitmapinfo &bminfo = *(lpbitmapinfo)hdib ;
lpvoid lpdibbits;
if( bminfo.bmiheader.bibitcount > 8 )
lpdibbits = (lpvoid)((lpdword)(bminfo.bmicolors +
bminfo.bmiheader.biclrused) +
((bminfo.bmiheader.bicompression == bi_bitfields) ? 3 : 0));
else
lpdibbits = (lpvoid)(bminfo.bmicolors + ncolors);
// create and select a logical palette if needed
if( ncolors <= 256 && dc.getdevicecaps(rastercaps) & rc_palette) { uint nsize="sizeof(logpalette)" + (sizeof(paletteentry) * ncolors); logpalette *plp="(logpalette" *) new byte[nsize]; plp->palversion = 0x300;
plp->palnumentries = ncolors;
for( int i=0; i palpalentry[i].pered = bminfo.bmicolors[i].rgbred;
plp->palpalentry[i].pegreen = bminfo.bmicolors[i].rgbgreen;
plp->palpalentry[i].peblue = bminfo.bmicolors[i].rgbblue;
plp