RichEdit中插入GIF动画(使用QQ的ImageOle.dll)
最近做聊天记录,需要显示GIF动画.看了很多文章,基本多是用QQ的ImageOle.dll或者Gif89a.dll来实现.当然还有其他方法,包括Static控件中使用CPictureEx来实现GIF.
ImageOle.dll使用了GdiPlus.dll,制作安装包时最好把这个dll也带上( XP系统自带)
(本文的代码来自其他网友)
参考a:http://www.codeproject.com/richedit/AnimatedEmoticon.asp?print=true
参考b: http://blog.joycode.com/jiangsheng/archive/2004/12/15/41209.aspx
1. 先用 regsvr32 注册一下ImageOle.dll
2. 代码
CRichEditCtrlEx 继承自CRichEditCtrl
void CRichEditCtrlEx::insertGif(CString strFilePath) //strFilePath gif文件路径
{
LPLOCKBYTES lpLockBytes = NULL;
SCODE sc;
HRESULT hr;
//print to RichEdit' s IClientSite
LPOLECLIENTSITE m_lpClientSite;
//A smart point to IAnimator
ImageOleLib::IGifAnimatorPtr m_lpAnimator;
//ptr 2 storage
LPSTORAGE m_lpStorage;
//the object 2 b insert 2
LPOLEOBJECT m_lpObject;
//Create lockbytes
sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);
if (sc != S_OK)
AfxThrowOleException(sc);
ASSERT(lpLockBytes != NULL);
//use lockbytes to create storage
sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,
STGM_SHARE_EXCLUSIVE |STGM_CREATE |STGM_READWRITE, 0, &m_lpStorage);
if (sc != S_OK)
{
VERIFY(lpLockBytes->Release() == 0);
lpLockBytes = NULL;
AfxThrowOleException(sc);
}
ASSERT(m_lpStorage != NULL);
//get the ClientSite of the very RichEditCtrl
GetIRichEditOle()->GetClientSite(&m_lpClientSite);
ASSERT(m_lpClientSite != NULL);
try
{
//Initlize COM interface
hr = ::CoInitialize(NULL) ;//( NULL, COINIT_APARTMENTTHREADED );