Getting a CF_DIB or CF_METAFILEPICT from the clipboard and displaying it






3.82/5 (8 votes)
Example code to display a CF_DIB or CF_METAFILEPICT from the clipboard
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() ; }
That's it! Enjoy!