Converts a image list to DIB

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.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read