iTimothy

君看一叶舟,出没风波里

0%

RICHEDIT中插入GIF

用qq的ImageOle.dll

// MyRichEdit.cpp : implementation file //

#include “stdafx.h” #include “ZJP.h” #include “MyRichEdit.h” #include “Richole.h”

#import “E:\Program files\tencent\qq\ImageOle.dll” named_guids

#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = FILE; #endif

///////////////////////////////////////////////////////////////////////////// // CMyRichEdit

CMyRichEdit::CMyRichEdit() { }

CMyRichEdit::~CMyRichEdit() { }

BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl) //{AFX_MSG_MAP(CMyRichEdit) // NOTE - the ClassWizard will add and remove mapping macros here. //}AFX_MSG_MAP END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMyRichEdit message handlers

void CMyRichEdit::InsertGraphics(CString strPicPath) { 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  );
                   if(  FAILED(hr)  )
                               _com_issue_error(hr);

                   //Get  GifAnimator  object
                   //here,  I  used  a  smart  point,  so  I  do  not  need  to  free  it
                   hr  =  m_lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator);
                   if(  FAILED(hr)  )
                                           _com_issue_error(hr);
                   //COM  operation  need  BSTR,  so  get  a  BSTR
                   BSTR  path  =  strPicPath.AllocSysString();

                   //Load  the  gif
                   hr  =  m_lpAnimator->LoadFromFile(path);
                   if(  FAILED(hr)  )
                               _com_issue_error(hr);

                   TRACE0(  m_lpAnimator->GetFilePath()  );

                   //get  the  IOleObject
                   hr  =  m_lpAnimator.QueryInterface(IID_IOleObject,  (void**)&m;_lpObject);
                   if(  FAILED(hr)  )
                               _com_issue_error(hr);

                   //Set  it  2  b  inserted
                   OleSetContainedObject(m_lpObject,  TRUE);

       //2  insert  in  2  richedit,  you  need  a  struct  of  REOBJECT
                   REOBJECT  reobject;
                   ZeroMemory(&reobject;,  sizeof(REOBJECT));

                   reobject.cbStruct  =  sizeof(REOBJECT);
                   CLSID  clsid;
                   sc  =  m_lpObject->GetUserClassID(&clsid;);
                   if  (sc  !=  S_OK)
                               AfxThrowOleException(sc);
                   //set  clsid
                   reobject.clsid  =  clsid;
                   //can  be  selected
                   reobject.cp  =  REO_CP_SELECTION;
                   //content,  but  not  static
                   reobject.dvaspect  =  DVASPECT_CONTENT;
                   //goes  in  the  same  line  of  text  line
                   reobject.dwFlags  =  REO_BELOWBASELINE;  //REO_RESIZABLE    ¦
                   reobject.dwUser  =  0;
                   //the  very  object
                   reobject.poleobj  =  m_lpObject;
                   //client  site  contain  the  object
                   reobject.polesite  =  m_lpClientSite;
                   //the  storage
                   reobject.pstg  =  m_lpStorage;

                   SIZEL  sizel;
                   sizel.cx  =  sizel.cy  =  0;
                   reobject.sizel  =  sizel;
                   HWND  hWndRT  =  this->m_hWnd;
                   //Sel  all  text

// ::SendMessage(hWndRT, EM_SETSEL, 0, -1); // DWORD dwStart, dwEnd; // ::SendMessage(hWndRT, EM_GETSEL, (WPARAM)&dwStart;, (LPARAM)&dwEnd;); // ::SendMessage(hWndRT, EM_SETSEL, dwEnd+1, dwEnd+1); //Insert after the line of text GetIRichEditOle()->InsertObject(&reobject;); ::SendMessage(hWndRT, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0); VARIANT_BOOL ret; //do frame changing ret = m_lpAnimator->TriggerFrameChange(); //show it m_lpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, m_lpClientSite, 0, m_hWnd, NULL); m_lpObject->DoVerb(OLEIVERB_SHOW, NULL, m_lpClientSite, 0, m_hWnd, NULL);

                   //redraw  the  window  to  show  animation
                   RedrawWindow();

                   if  (m_lpClientSite)
                   {
                               m_lpClientSite->Release();
                               m_lpClientSite  =  NULL;
                   }
                   if  (m_lpObject)
                   {
                               m_lpObject->Release();
                               m_lpObject  =  NULL;
                   }
                   if  (m_lpStorage)
                   {
                               m_lpStorage->Release();
                               m_lpStorage  =  NULL;
                   }

                   SysFreeString(path);
       }
       catch(  _com_error  e  )
       {
                   AfxMessageBox(e.ErrorMessage());
                   ::CoUninitialize();
       }

}

支持原创技术分享,据说打赏我的人,都找到了女朋友!