桌面开发
现在阅读
Getting a CF_DIB or CF_METAFILEPICT from the clipboard and displaying it
0

Getting a CF_DIB or CF_METAFILEPICT from the clipboard and displaying it

由 ultracpy2018年1月16日

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!

出处:https://www.codeproject.com/Articles/3355/Getting-a-CF-DIB-or-CF-METAFILEPICT-from-the-clipb

关于作者
ultracpy
评论

    你必须 登录 提交评论