现在有个新的问题,RichEdit怎么实现gif ole控件的复制和粘贴?
比如,我现在插入一个C:\\1.gif的ole控件在RichEdit中,传入的dwUser=1,来标识这个gif的唯一性。现在我在RichEdit中copy这个控件,然后 粘贴这个控件,我需要识别粘贴的gif的路径C:\\1.gif或者 dwUser=1,然后一样的插入到RichEdit中。
已经找到了点信息,就是在
RichEdit的 GetClicpboradData和 QueryAcceptData这两个callBack接口的实现中,通过自定义的数据格式转换ClipBorad中的 内容。
但是具体怎么做还是不知道。  有高手指教下吗?

解决方案 »

  1.   

    我以前是在内存里把gif转成bmp
    不过这样动画就没了
      

  2.   


    呵呵,我要求能够复制gif的。
      

  3.   

    希望对你有帮助吧void GPFaceListDlg::InsertFace(CRichEditCtrl* pRichEdit, GPPicture* pFacePic, int nFaceIndex)
    {
    //设置显示目标
    STGMEDIUM stgMedium; stgMedium.tymed = TYMED_GDI;
    stgMedium.hBitmap = pFacePic->GetBitmapHandle(pRichEdit->GetSafeHwnd());
    stgMedium.pUnkForRelease = NULL; //设置显示格式
    FORMATETC etcFormat;
    etcFormat.cfFormat = CF_BITMAP;
    etcFormat.ptd = NULL;
    etcFormat.dwAspect = DVASPECT_CONTENT;
    etcFormat.lindex = -1;
    etcFormat.tymed = TYMED_GDI; //创建输入数据源及内存对象
    IStorage* pISData;
    LPLOCKBYTES lpLockBytes = NULL;
    SCODE sCode; //校验码
    sCode = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
    if (sCode != S_OK)
    AfxThrowOleException(sCode);
    ASSERT(lpLockBytes != NULL);

    sCode = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pISData);
    if (sCode != S_OK)
    {
    VERIFY(lpLockBytes->Release() == 0);
    lpLockBytes = NULL;
    AfxThrowOleException(sCode);
    }
    ASSERT(pISData != NULL); COleDataSource* pDataSource = new COleDataSource;
    pDataSource->CacheData(CF_BITMAP, &stgMedium);
    LPDATAOBJECT lpDataObject = (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject); //获取RichEdit的OLEClientSite
    LPOLECLIENTSITE lpClientSite;
    pRichEdit->GetIRichEditOle()->GetClientSite(&lpClientSite); //创建OLE对象
    IOleObject *pOleObject;
    sCode = OleCreateStaticFromData(lpDataObject, IID_IOleObject, OLERENDER_FORMAT, &etcFormat, lpClientSite, pISData, (void **)&pOleObject);
    if(sCode!=S_OK)
    AfxThrowOleException(sCode); //插入OLE对象
    REOBJECT reObject;
    ZeroMemory(&reObject, sizeof(REOBJECT));
    reObject.cbStruct = sizeof(REOBJECT);

    CLSID clsid;
    sCode = pOleObject->GetUserClassID(&clsid);
    if (sCode != S_OK)
    AfxThrowOleException(sCode); reObject.dwUser = nFaceIndex;
    reObject.clsid = clsid;
    reObject.cp = REO_CP_SELECTION;
    reObject.dvaspect = DVASPECT_CONTENT;
    reObject.poleobj = pOleObject;
    reObject.polesite = lpClientSite;
    reObject.pstg = pISData; pRichEdit->GetIRichEditOle()->InsertObject(&reObject);
    delete pDataSource;
    }
      

  4.   


    谢谢,呵呵,这个是插入ole控件的代码呀,我这个已经实现了,实现过程跟这个差不多的。我现在是想支持ole控件在richedit里面的复制和粘贴。
      

  5.   

    http://topic.csdn.net/u/20090806/09/c2d37618-8deb-4f1a-b0bd-2490401fe115.html
      

  6.   

    其实 link也可以是OLE对象
    这样像什么链接安全检查啊,文字和链接分离啊 就很好控制了
      

  7.   

    复制粘贴不还是一样
    我的做法就是插入我就是问,在RichEdit中复制和粘贴的时候,怎么知道我该插入那个呀?  我怎么获得我复制的是哪个gif呢?我的意思也是这样,我先获得我复制的那个gif,然后在粘贴的时候,我再插入一个相同的gif就完了。现在问题是,我不知道怎么获得复制的gif的相关信息?
      

  8.   

    ole控件不是你自己写的吗?
    你多提供个接口不就完事了?
      

  9.   

    我用的方法是转义
    腾讯的QQ就是这样做的
    所以我们复制代码进QQ时会识别成便表情
    比如/wx
      

  10.   

    http://topic.csdn.net/u/20090806/09/c2d37618-8deb-4f1a-b0bd-2490401fe115.html
      

  11.   

    我用的方法是转义
    腾讯的QQ就是这样做的
    所以我们复制代码进QQ时会识别成便表情
    比如/wx
    我现在就是需要知道,我该怎么转义?就是我在RichEdit中点复制的时候,我怎么复制这个gif图标,也就是怎么获得与gif对应的转义字符串? 我现在的复制都是复制了整个gif图像?也就是我该怎么处理复制和粘贴?在哪处理??? 请教大哥,可以说的更详细些吗?