ImageList to DIB
--------------------------------------------------------------------------------
This article was contributed by Mike Wild.
In my PrintTree sample I wanted to print the tree in color. This was easy for text, but not for the icons. I tried a lot to convert the imagelist to DIB, but what I really needed was a method, which gives back the DIB of one icon, not of the whole Imagelist. And here is the used method:
HANDLE CAdvancedTreeCtrl::ImageToDIB( CImageList * pImageList, int iImageNumber, CWnd * pWnd,
BOOL bOverlay, HTREEITEM actualItem )
... {
// Local Variables
CBitmap bitmap;
CWindowDC dc( pWnd );
CDC memDC;
CRect rect;
CPalette pal;
IMAGEINFO imageInfo;
if( FALSE == pImageList->GetImageInfo( iImageNumber, &imageInfo ) )
...{
// Getting of the Imageinfos failed
return NULL;
}
// Create compatible stuff and select Bitmap
if( FALSE == memDC.CreateCompatibleDC( &dc ) )
...{
// Create failed
return NULL;
}
if( FALSE == bitmap.CreateCompatibleBitmap( &dc,
imageInfo.rcImage.bottom-imageInfo.rcImage.top,
imageInfo.rcImage.right-imageInfo.rcImage.left ) )
...{
// Create failed
return NULL;
}
CBitmap* pOldBitmap = memDC.SelectObject( &bitmap );
if( NULL == pOldBitmap )
...{
// Select failed
return NULL;
}
// Local Variables for Draw
CPoint point( 0, 0);
UINT nStyle = ILD_NORMAL;
// Is there an Overlay
if( TRUE == bOverlay )
...{
// Set the wanted style
nStyle = ILD_TRANSPARENT | ( TVIS_OVERLAYMASK & GetItemState( actualItem, TVIS_OVERLAYMASK ) );
}
// Draw Image to the compatible DC
if( FALSE == pImageList->Draw( &memDC, iImageNumber, point, nStyle ) )
...{
// Drawing of the Image failed
return NULL;
}
// Create logical palette if device support a palette
if( dc.GetDeviceCaps( RASTERCAPS ) & RC_PALETTE )
...{
UINT nSize = sizeof(LOGPALETTE) + ( sizeof(PALETTEENTRY) * 256 );
LOGPALETTE* pLP = (LOGPALETTE*)new BYTE[nSize];
pLP->palVersion = 0x300;
pLP->palNumEntries = (unsigned short)GetSystemPaletteEntries( dc, 0, 255,
pLP->palPalEntry );
// Create the palette
pal.CreatePalette( pLP );
// Free memory
delete[] pLP;
}
memDC.SelectObject( pOldBitmap );
// Convert the bitmap to a DIB
return DDBToDIB( bitmap, BI_RGB, &pal );
}
The DDBToDIB-Method is the one already published under "Converting DDB to DIB".
Bugs and Improvements: Please report all bugs and improvements to me, thanks and enjoy it.
Date Posted: 5 May 1998
Last updated: 22 March 1999