1、采用的是QQ的ImageOle.dll,使用之前,先将ImageOle.dll拷贝到system32目录下(64位系统拷贝到相应目录下),然后注册:regsvr32 ImageOle.dll
2、有时候需将CRichEditCtrl的TransParent属性设置为True,即透明模式
3、CSkinRichEdit继承自CRichEditCtrl
实现如下
//插入图片
void CSkinRichEdit::InsertImage( CString strPicPath )
{
//变量定义
LPLOCKBYTES lpLockBytes = NULL;
SCODE sc;
HRESULT hr;
LPOLECLIENTSITE lpClientSite;
ImageOleLib::IGifAnimatorPtr lpAnimator;
LPSTORAGE lpStorage;
LPOLEOBJECT lpObject;
//申请资源
sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
if (sc != S_OK)
AfxThrowOleException(sc);
ASSERT(lpLockBytes != NULL);
sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &lpStorage);
if (sc != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(sc);
}
ASSERT(lpStorage != NULL);
//获取接口
GetIRichEditOle()->GetClientSite(&lpClientSite);
ASSERT(lpClientSite != NULL);
try
{
//I初始接口
hr = ::CoInitializeEx( NULL, COINIT_APARTMENTTHREADED );//::CoInitialize(NULL);
if( FAILED(hr) )
_com_issue_error(hr);
//获取对象(需将ImageOle.dll拷贝到system32(32位系统)目录下注册一下,此函数才能运行成功)
hr = lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator);
if( FAILED(hr) )
{
char cErrorNum[20]={0};
itoa((int)GetLastError(),cErrorNum,10);
AfxMessageBox(cErrorNum);
_com_issue_error(hr);
}
//转换对象
BSTR path = strPicPath.AllocSysString();
//加载图片
hr = lpAnimator->LoadFromFile(path);
if( FAILED(hr) )
_com_issue_error(hr);
TRACE0( lpAnimator->GetFilePath() );
//获取对象
hr = lpAnimator.QueryInterface(IID_IOleObject, (void**)&lpObject);
if( FAILED(hr) )
_com_issue_error(hr);
OleSetContainedObject(lpObject, TRUE);
REOBJECT reobject;
ZeroMemory(&reobject, sizeof(REOBJECT));
reobject.cbStruct = sizeof(REOBJECT);
CLSID clsid;
sc = lpObject->GetUserClassID(&clsid);
if (sc != S_OK)
AfxThrowOleException(sc);
//设置变量
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;
sizel.cx = sizel.cy = 0;
reobject.sizel = sizel;
HWND hWndRT = this->m_hWnd;
GetIRichEditOle()->InsertObject(&reobject);
::SendMessage(hWndRT, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0);
VARIANT_BOOL ret;
ret = lpAnimator->TriggerFrameChange();
//显示图片
lpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, lpClientSite, 0, m_hWnd, NULL);
lpObject->DoVerb(OLEIVERB_SHOW, NULL, lpClientSite, 0, m_hWnd, NULL);
//更新窗体
RedrawWindow();
//释放接口
if (lpClientSite)
{
lpClientSite->Release();
lpClientSite = NULL;
}
if (lpObject)
{
lpObject->Release();
lpObject = NULL;
}
if (lpStorage)
{
lpStorage->Release();
lpStorage = NULL;
}
SysFreeString(path);
}
catch( _com_error e )
{
::CoUninitialize();
}
}