本帖最后由 TragicGuy 于 2013-01-23 09:03:59 编辑

解决方案 »

  1.   

    剪切板 和qq保存的区别吧!http://blog.csdn.net/peterpan19890802/article/details/5746950
      

  2.   

    已经找到原因,由于从别处复制过来的图片的类型是:CF_METAFILEPICT,而不是CF_BITMAP,获取时需要设置好正确的FORMATETC fm; 目前已经可以GetData成功,但想要将HENHMETAFILE hMetaFile=CopyEnhMetaFile(sm.hEnhMetaFile, strPath);时失败,继续寻找。
      

  3.   

    调整后的代码如下:
    由于 从QQ或者WORD复制粘贴的图片格式为:CF_METAFILEPICT
    调整后GetData能成功,但尝试将其保存为文件时出错:
    HENHMETAFILE hMetaFile=CopyEnhMetaFile(sm.hEnhMetaFile, "c:\test.emf");//保存到文件
    DWORD dwRet = GetLastError();这里dwRet=6,表示句柄无效。
    请问这里如何将获取到的sm.hEnhMetaFile保存为实际的图片文件?
    DWORD CSkinRichEdit::GetSelectObjectUser(CString& strPathRet)
    {
    DWORD dRet = 0;
    int nCount = m_pIRichEditOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象 for ( int i=nCount -1; i >= 0; i-- )
    {
    REOBJECT reobject;
    memset( &reobject, 0 , sizeof(REOBJECT) );
    reobject.cbStruct = sizeof(REOBJECT);

    SCODE sc = m_pIRichEditOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
    if ( sc != S_OK )
    {
    continue;
    } if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
    {
    continue; // 不是当前选中的对象,继续查找
    }
    IDataObject* pDataObject = NULL;
    sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
    if ( sc != S_OK )
    {
    break;
    }

    CString strPath = "";
    if(reobject.dwUser > 0)
    {
    dRet = reobject.dwUser;
    }
    else
    {
    IEnumFORMATETC *pEnumFmt = NULL;
    if (S_OK != pDataObject->EnumFormatEtc(DATADIR_GET,&pEnumFmt))
    break; FORMATETC fm;  
    STGMEDIUM sm;    CString strPath = "c:\\test.bmp";
    HRESULT Ret = S_OK;
    ULONG Fetched;
    while(Ret == S_OK)
    {
    HRESULT ret=pEnumFmt->Next(1,&fm,&Fetched);
    if(SUCCEEDED(ret))
    {
    if( fm.cfFormat == CF_METAFILEPICT //媒体
    ||fm.cfFormat == CF_BITMAP //位图
    || fm.cfFormat == CF_DIB) //DIB
    {
    if(fm.cfFormat == CF_DIB)
    fm.cfFormat = CF_BITMAP; if (S_OK != pDataObject->GetData(&fm, &sm))
    {
    break;
    }
    if (sm.pUnkForRelease != NULL)
    {
    break;
    }
    if (fm.cfFormat == CF_BITMAP //位图
    || fm.cfFormat == CF_DIB)
    {
    CImage image;
    image.Attach(sm.hBitmap);
    image.Save(strPath);

    }
    else
    {
    HENHMETAFILE hMetaFile=CopyEnhMetaFile(sm.hEnhMetaFile, "c:\test.emf");//保存到文件
    DWORD dwRet = GetLastError();
    DeleteEnhMetaFile(hMetaFile);
    }
    dRet = reobject.dwUser = SetImagePath(strPath);
    ::ReleaseStgMedium(&sm);
    Ret = S_FALSE;
    }
    }
    else
    {
    Ret = S_FALSE;
    }
    }
    }
    pDataObject->Release();
    break;
    }
    if (dRet > 1000)
    {
    GetImagePath(dRet, strPathRet);
    }
    return dRet;
    }
      

  4.   

    CString str = "c:\\test.jpg";
    LPMETAFILEPICT pMFP = 
    (LPMETAFILEPICT) GlobalLock (sm.hMetaFilePict);


    HMETAFILE hFileRet = CopyMetaFile(pMFP->hMF, str); DWORD dwRet = GetLastError();
    DeleteMetaFile(hFileRet);
    GlobalUnlock(sm.hMetaFilePict);
      

  5.   

    终于搞定了,代码如下,希望可以帮助到后来人:
    DWORD CSkinRichEdit::GetSelectObjectUser(CString& strPathRet, CString strPicFlag)
    {
    DWORD dRet = 0;
    int nCount = m_pIRichEditOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象 for ( int i=nCount -1; i >= 0; i-- )
    {
    REOBJECT reobject;
    memset( &reobject, 0 , sizeof(REOBJECT) );
    reobject.cbStruct = sizeof(REOBJECT);

    SCODE sc = m_pIRichEditOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
    if ( sc != S_OK )
    {
    continue;
    } if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
    {
    continue; // 不是当前选中的对象,继续查找
    }
    IDataObject* pDataObject = NULL;
    sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
    if ( sc != S_OK )
    {
    break;
    }

    CString strPath = "";
    if(reobject.dwUser > 0)
    {
    dRet = reobject.dwUser;
    }
    else
    {
    IEnumFORMATETC *pEnumFmt = NULL;
    if (S_OK != pDataObject->EnumFormatEtc(DATADIR_GET,&pEnumFmt))
    break; FORMATETC fm;  
    STGMEDIUM sm;    CString strPath = "c:\test.jpg"; HRESULT Ret = S_OK;
    ULONG Fetched;
    while(Ret == S_OK)
    {
    HRESULT ret=pEnumFmt->Next(1,&fm,&Fetched);
    if(SUCCEEDED(ret))
    {
    if( 
    fm.cfFormat == CF_METAFILEPICT //媒体
    ||fm.cfFormat == CF_BITMAP //位图
    || fm.cfFormat == CF_DIB) //DIB
    {
    if(fm.cfFormat == CF_DIB)
    fm.cfFormat = CF_BITMAP; if (S_OK != pDataObject->GetData(&fm, &sm))
    {
    break;
    }
    if (sm.pUnkForRelease != NULL)
    {
    break;
    }
    if (fm.cfFormat == CF_BITMAP //位图
    || fm.cfFormat == CF_DIB)
    {
    CImage image;
    image.Attach(sm.hBitmap);
    image.Save(strPath);

    }
    else
    {
    LPMETAFILEPICT pMFP = (LPMETAFILEPICT) GlobalLock (sm.hMetaFilePict);
    SaveToBitMap(pMFP, strPath);
    GlobalUnlock(sm.hMetaFilePict);
    }
    dRet = reobject.dwUser = SetImagePath(strPath);
    ::ReleaseStgMedium(&sm);
    Ret = S_FALSE;
    }
    }
    else
    {
    Ret = S_FALSE;
    }
    }
    }
    pDataObject->Release();
    break;
    }
    if (dRet > 1000)
    {
    GetImagePath(dRet, strPathRet);
    }
    return dRet;
    }
    //////////////////////////////////////////////////////////////////////////void CSkinRichEdit::SaveToBitMap(LPMETAFILEPICT pMFP, CString strPath )
    {
    SIZE size;
    CDC* pDC = GetDC();
    if (pDC)
    {
    size.cx = pMFP->xExt;
    size.cy = pMFP->yExt;
    pDC->HIMETRICtoDP(&size); CBitmap bm;
    bm.CreateCompatibleBitmap(pDC, abs(size.cx), abs(size.cy)); CDC memdc;
    memdc.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = memdc.SelectObject(&bm); memdc.SetMapMode(pMFP->mm) ;
    memdc.SetViewportExt(abs(size.cx), abs(size.cy)) ;
    memdc.SetViewportOrg(0, 0);
    memdc.PlayMetaFile(pMFP->hMF);
    CImage img;
    img.Attach((HBITMAP)bm.GetSafeHandle());
    img.Save(strPath);
    memdc.SelectObject(pOldBitmap);
    memdc.DeleteDC();
    bm.DeleteObject();
    ReleaseDC(pDC);
    }
    }
      

  6.   

    我想问楼主,你的IDataObject接口是自己实现的吗?
      

  7.   

    在GetData方法中要填充STGMEDIUM结构体的值,可是这些值是从哪传递进来的呢?,求大神
      

  8.   

    请问下楼主 CRicheditCtrl里面的图片 如何通过代码进行删除呢?
    如有空帮忙看下 我发的这个求助帖子吧 先谢过了!