想在crichedit中插入GIF动画,会的请帮下 找了点相关资料,看很多人都是用到QQ的imageole.dll,但我基础不是很好,有会的请祥细帮下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这个得写一个控件插入richedit中的.imageole.dll是QQ写好的控件 是不是要重写richedit类?重写的时候要用到imageole richedit不需要重写,写控件就可以了。如果使用imageole的话连控件都不用写。 就按楼上所说的,在RichEdit中直接嵌入一个OLE对象,用这个OLE对象来显示gif动画。 要怎么嵌入,还有OLE和GIF动画要怎么建立关系,他们的关系是怎么样的..这些我不太明白喔 帮你找到如下代码,使用之前要通过#import语句导入imageole的类型库:void UnmanagedInsertGif(int hwndRichEdit,wchar_t * pFilePath){ HWND h=(HWND)hwndRichEdit; LPRICHEDITOLE lpRichEditOle=NULL; LPOLEOBJECT lpObject=NULL; LPSTORAGE lpStorage=NULL; LPOLECLIENTSITE lpClientSite=NULL; LPLOCKBYTES lpLockBytes = NULL; REOBJECT reobject; ZeroMemory(&reobject, sizeof(REOBJECT)); reobject.cbStruct = sizeof(REOBJECT); HRESULT hr=S_OK; CLSID clsid=CLSID_NULL; do{ ::SendMessage(h, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle); if(lpRichEditOle==NULL)break; hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); if (hr != S_OK||lpLockBytes==NULL) break; hr= ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage); if (hr!= S_OK||lpStorage==NULL) break; hr=lpRichEditOle->GetClientSite(&lpClientSite); if (hr!= S_OK||lpClientSite==NULL) break; try { ImageOleLib::IGifAnimatorPtr lpAnimator; hr = lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator); if( FAILED(hr) ) _com_issue_error(hr); _bstr_t bstrPath(pFilePath); hr = lpAnimator->LoadFromFile(bstrPath); if( FAILED(hr) ) _com_issue_error(hr); hr = lpAnimator.QueryInterface(IID_IOleObject, (void**)&lpObject); if( FAILED(hr)||lpObject==NULL) _com_issue_error(hr); hr=OleSetContainedObject(lpObject, TRUE); if( FAILED(hr) ) _com_issue_error(hr); hr=lpObject->GetUserClassID(&clsid); if( FAILED(hr) ) _com_issue_error(hr); reobject.clsid = clsid; reobject.cp = REO_CP_SELECTION; reobject.dvaspect = DVASPECT_CONTENT; reobject.dwFlags = REO_BELOWBASELINE; reobject.dwUser = 0; reobject.poleobj = lpObject; reobject.polesite = lpClientSite; reobject.pstg = lpStorage; SIZEL sizel={0,0}; reobject.sizel = sizel; hr=lpRichEditOle->InsertObject(&reobject); } catch( _com_error e ) { LPCTSTR lpszErrMessage=e.ErrorMessage(); } }while(FALSE); if(lpLockBytes) lpObject->Release(); if(lpLockBytes) lpLockBytes->Release(); if(lpClientSite) lpClientSite->Release(); if(lpRichEditOle) lpRichEditOle->Release();}void UnmanagedGifTriggerFrameChange(int hwndRichEdit){ HWND h=(HWND)hwndRichEdit; LPRICHEDITOLE lpRichEditOle=NULL; LPOLECLIENTSITE lpClientSite=NULL; LPOLECONTAINER lpContainer=NULL; LPENUMUNKNOWN lpEnumUnknown=NULL; HRESULT hr=S_OK; do{ ::SendMessage(h, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle); if(lpRichEditOle==NULL)break; hr=lpRichEditOle->GetClientSite(&lpClientSite); if (hr!= S_OK||lpClientSite==NULL) break; hr=lpClientSite->GetContainer(&lpContainer); if (hr!= S_OK||lpClientSite==NULL) break; hr=lpContainer->EnumObjects(OLECONTF_EMBEDDINGS,&lpEnumUnknown); if (hr!= S_OK||lpEnumUnknown==NULL) break; IUnknown* pUnk=NULL; ULONG uFetched=0; for (UINT i = 0; S_OK == lpEnumUnknown->Next(1, &pUnk, &uFetched); i++) { ImageOleLib::IGifAnimator* pAnimator=NULL; do{ hr=pUnk->QueryInterface(__uuidof(ImageOleLib::IGifAnimator),(LPVOID*)&pAnimator); if (hr!= S_OK) break; try{ ImageOleLib::IGifAnimatorPtr lpAnimator; lpAnimator.Attach(pAnimator,true); lpAnimator->TriggerFrameChange(); } catch( _com_error e ) { LPCTSTR lpszErrMessage=e.ErrorMessage(); } } while(FALSE); pUnk->Release(); if(pAnimator) pAnimator->Release(); } }while(FALSE); if(lpEnumUnknown) lpEnumUnknown->Release(); if(lpContainer) lpContainer->Release(); if(lpRichEditOle) lpRichEditOle->Release(); if(lpClientSite) lpClientSite->Release();} 在发布用VC++.net 2003开发的用于Web页面的OCX控件时如何去掉对.net环境的依赖? 有关天敏SDK—2000的编程问题 求教怎样在ADO中获得日期,计算2者之间的天数! DLL程序如何知道主窗口的OnSize 请问怎么实现在全屏游戏中呼出浮动窗口?在线等 怎么得到combox选择的内容的? SDK中怎么样才能实现:点击菜单后打开固定的文件 怎么在命令行方式关机? DoModal函数产生的对话框,没有指定回调函数,怎么得到处理的? 一个网络功击建议,如有兴趣可进来一起讨论 vc 在excel 里插入或者清除数据 请教高手。 救急。html连接数据库的问题。
{
HWND h=(HWND)hwndRichEdit;
LPRICHEDITOLE lpRichEditOle=NULL;
LPOLEOBJECT lpObject=NULL;
LPSTORAGE lpStorage=NULL;
LPOLECLIENTSITE lpClientSite=NULL;
LPLOCKBYTES lpLockBytes = NULL; REOBJECT reobject;
ZeroMemory(&reobject, sizeof(REOBJECT));
reobject.cbStruct = sizeof(REOBJECT); HRESULT hr=S_OK;
CLSID clsid=CLSID_NULL;
do{
::SendMessage(h, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle);
if(lpRichEditOle==NULL)break;
hr= ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
if (hr != S_OK||lpLockBytes==NULL) break;
hr= ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
if (hr!= S_OK||lpStorage==NULL) break;
hr=lpRichEditOle->GetClientSite(&lpClientSite);
if (hr!= S_OK||lpClientSite==NULL) break;
try
{
ImageOleLib::IGifAnimatorPtr lpAnimator;
hr = lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator);
if( FAILED(hr) ) _com_issue_error(hr);
_bstr_t bstrPath(pFilePath);
hr = lpAnimator->LoadFromFile(bstrPath);
if( FAILED(hr) ) _com_issue_error(hr);
hr = lpAnimator.QueryInterface(IID_IOleObject, (void**)&lpObject);
if( FAILED(hr)||lpObject==NULL) _com_issue_error(hr);
hr=OleSetContainedObject(lpObject, TRUE);
if( FAILED(hr) ) _com_issue_error(hr);
hr=lpObject->GetUserClassID(&clsid);
if( FAILED(hr) ) _com_issue_error(hr);
reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_BELOWBASELINE;
reobject.dwUser = 0;
reobject.poleobj = lpObject;
reobject.polesite = lpClientSite;
reobject.pstg = lpStorage;
SIZEL sizel={0,0};
reobject.sizel = sizel;
hr=lpRichEditOle->InsertObject(&reobject);
}
catch( _com_error e )
{
LPCTSTR lpszErrMessage=e.ErrorMessage();
} }while(FALSE);
if(lpLockBytes)
lpObject->Release();
if(lpLockBytes)
lpLockBytes->Release();
if(lpClientSite)
lpClientSite->Release();
if(lpRichEditOle)
lpRichEditOle->Release();
}
void UnmanagedGifTriggerFrameChange(int hwndRichEdit)
{
HWND h=(HWND)hwndRichEdit;
LPRICHEDITOLE lpRichEditOle=NULL;
LPOLECLIENTSITE lpClientSite=NULL;
LPOLECONTAINER lpContainer=NULL;
LPENUMUNKNOWN lpEnumUnknown=NULL;
HRESULT hr=S_OK;
do{
::SendMessage(h, EM_GETOLEINTERFACE, 0, (LPARAM)&lpRichEditOle);
if(lpRichEditOle==NULL)break;
hr=lpRichEditOle->GetClientSite(&lpClientSite);
if (hr!= S_OK||lpClientSite==NULL) break;
hr=lpClientSite->GetContainer(&lpContainer);
if (hr!= S_OK||lpClientSite==NULL) break;
hr=lpContainer->EnumObjects(OLECONTF_EMBEDDINGS,&lpEnumUnknown);
if (hr!= S_OK||lpEnumUnknown==NULL) break; IUnknown* pUnk=NULL;
ULONG uFetched=0;
for (UINT i = 0; S_OK == lpEnumUnknown->Next(1, &pUnk, &uFetched); i++)
{
ImageOleLib::IGifAnimator* pAnimator=NULL;
do{
hr=pUnk->QueryInterface(__uuidof(ImageOleLib::IGifAnimator),(LPVOID*)&pAnimator);
if (hr!= S_OK) break;
try{
ImageOleLib::IGifAnimatorPtr lpAnimator;
lpAnimator.Attach(pAnimator,true);
lpAnimator->TriggerFrameChange();
}
catch( _com_error e )
{
LPCTSTR lpszErrMessage=e.ErrorMessage();
}
}
while(FALSE);
pUnk->Release();
if(pAnimator)
pAnimator->Release();
}
}while(FALSE);
if(lpEnumUnknown)
lpEnumUnknown->Release();
if(lpContainer)
lpContainer->Release();
if(lpRichEditOle)
lpRichEditOle->Release();
if(lpClientSite)
lpClientSite->Release();
}