Getting a CF_DIB or CF_METAFILEPICT from the clipboard and displaying it
Introduction
I needed to display a bitmap from the clipboard which is in the CF_DIB format in one of my applications. The standard MSDN docs did not have any information on how to do this. Also, all the other clipboard articles here had code to write CF_DIB to the clipboard, but not read it. Also I already had some existing code to display a metafile from the clipboard, both of which may be of use.
// pDC is the DC to draw to
// metafile is a CRect to display the DIB/Metafile in
CRect metafile(0, 0, 100, 100); // example location
if (IsClipboardFormatAvailable(CF_METAFILEPICT))
{
// play a metafile from the clipboard if available
GLOBALHANDLE hGMem ;
LPMETAFILEPICT lpMFP ;
OpenClipboard() ;
hGMem = GetClipboardData(CF_METAFILEPICT) ;
lpMFP = (LPMETAFILEPICT)GlobalLock(hGMem) ;
pDC->SaveDC() ;
pDC->SetMapMode(lpMFP->mm) ;
pDC->SetViewportExt(metafile.Width(), metafile.Height()) ;
pDC->SetViewportOrg(metafile.left, metafile.top) ;
pDC->PlayMetaFile(lpMFP->hMF) ;
VERIFY(pDC->RestoreDC(-1)) ;
GlobalUnlock(hGMem) ;
CloseClipboard() ;
}
if (IsClipboardFormatAvailable(CF_DIB))
{
// a DIB is in the clipboard, draw it out
GLOBALHANDLE hGMem ;
LPBITMAPINFO lpBI ;
void* pDIBBits;
OpenClipboard() ;
hGMem = GetClipboardData(CF_DIB) ;
lpBI = (LPBITMAPINFO)GlobalLock(hGMem) ;
// point to DIB bits after BITMAPINFO object
pDIBBits = (void*)(lpBI + 1);
::StretchDIBits(pDC->m_hDC,
metafile.left, metafile.top,
metafile.Width(), metafile.Height(),
0, 0, lpBI->bmiHeader.biWidth,
lpBI->bmiHeader.biHeight,
pDIBBits, lpBI, DIB_RGB_COLORS, SRCCOPY);
GlobalUnlock(hGMem) ;
CloseClipboard() ;
}