更多内容请看MSN图像 MSN专题 QQ表情专题,或 ImageOle.tlh 1// Created by Microsoft (R) C/C++ Compiler Version 12.00.8168.0 (9de7951a). 2// 3// d:/myproject/msger/debug/ImageOle.tlh 4// 5// C++ source equivalent of Win32 type library D://Program files//tencent//qq//ImageOle.dll 6// compiler-generated file created 10/25/04 at 22:00:58 - DO NOT EDIT! 7#pragma once 8#pragma pack(push, 8) 9#include 10 11namespace ImageOleLib { 12 13// 14// Forward references and typedefs 15// 16 17strUCt /* coclass */ GifAnimator;
接着就是实现代码了。现在看应该没有很大的问题。假如还是很难明白。那么我你得好好研究CRichEditCtrl和OLE了。听说Inside OLE和Inside COM很好。我没有弄到。就看了《COM+编程指南》和潘爱民的《COM原理和应用》,不错!还有一个好东西。就是 ActiveX Control Test Container 的源代码。
更多内容请看MSN图像 MSN专题 QQ表情专题,或 最后该出场的就是实现代码了。 1 LPLOCKBYTES lpLockBytes = NULL; 2 SCODE sc; 3 HRESULT hr; 4 //print to RichEdit' s IClientSite 5 LPOLECLIENTSITE m_lpClientSite; 6 //A smart point to IAnimator 7 IGifAnimatorPtr m_lpAnimator; 8 //ptr 2 storage 9 LPSTORAGE m_lpStorage; 10 //the object 2 b insert 2 11 LPOLEOBJECT m_lpObject; 12 13 //Create lockbytes 14 sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes); 15 if (sc != S_OK) 16 AfxThrowOleException(sc); 17 ASSERT(lpLockBytes != NULL); 18 19 //use lockbytes to create storage 20 sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, 21 STGM_SHARE_EXCLUSIVESTGM_CREATESTGM_READWRITE, 0, &m_lpStorage); 22 if (sc != S_OK) 23 { 24 VERIFY(lpLockBytes->Release() == 0); 25 lpLockBytes = NULL; 26 AfxThrowOleException(sc); 27 } 28 ASSERT(m_lpStorage != NULL); 29 30 //get the ClientSite of the very RichEditCtrl 31 GetIRichEditOle()->GetClientSite(&m_lpClientSite); 32 ASSERT(m_lpClientSite != NULL); 33 34 try 35 { 36 //Initlize COM interface 37 hr = ::CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); 38 if( FAILED(hr) ) 39 _com_issue_error(hr); 40 41 //Get GifAnimator object 42 //here, I used a smart point, so I do not need to free it
43 hr = m_lpAnimator.CreateInstance(CLSID_GifAnimator); 44 if( FAILED(hr) ) 45 _com_issue_error(hr); 46 //COM Operation need BSTR, so get a BSTR 47 BSTR path = strPicPath.AllocSysString(); 48 49 //Load the gif 50 hr = m_lpAnimator->LoadFromFile(path); 51 if( FAILED(hr) ) 52 _com_issue_error(hr); 53 54 TRACE0( m_lpAnimator->GetFilePath() ); 55 56 //get the IOleObject 57 hr = m_lpAnimator.QueryInterface(IID_IOleObject, (void**)&m_lpObject); 58 if( FAILED(hr) ) 59 _com_issue_error(hr); 60 61 //Set it 2 b inserted 62 OleSetContainedObject(m_lpObject, TRUE); 63 64 //2 insert in 2 richedit, you need a struct of REOBJECT 65 REOBJECT reobject; 66 ZeroMemory(&reobject, sizeof(REOBJECT)); 67 68 reobject.cbStruct = sizeof(REOBJECT); 69 CLSID clsid; 70 sc = m_lpObject->GetUserClassID(&clsid); 71 if (sc != S_OK) 72 AfxThrowOleException(sc); 73 //set clsid 74 reobject.clsid = clsid; 75 //can be selected 76 reobject.cp = REO_CP_SELECTION; 77 //content, but not static 78 reobject.dvaspect = DVASPECT_CONTENT; 79 //goes in the same line of text line 80 reobject.dwFlags = REO_BELOWBASELINE; //REO_RESIZABLE 81 reobject.dwUser = 0; 82 //the very object 83 reobject.poleobj = m_lpObject; 84 //client site contain the object 85 reobject.polesite = m_lpClientSite; 86 //the storage 87 reobject.pstg = m_lpStorage; 88 89 SIZEL sizel; 90 sizel.cx = sizel.cy = 0; 91 reobject.sizel = sizel; 92 HWND hWndRT = this->m_hWnd; 93 //Sel all text 94// ::SendMessage(hWndRT, EM_SETSEL, 0, -1); 95// DWORD dwStart, dwEnd; 96// ::SendMessage(hWndRT, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd); 97// ::SendMessage(hWndRT, EM_SETSEL, dwEnd+1, dwEnd+1); 98 //Insert after the line of text 99 GetIRichEditOle()->InsertObject(&reobject); 100 ::SendMessage(hWndRT, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0); 101 VARIANT_BOOL ret; 102 //do frame changing 103 ret = m_lpAnimator->TriggerFrameChange(); 104 //show it 105 m_lpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, m_lpClientSite, 0, m_hWnd, NULL); 106 m_lpObject->DoVerb(OLEIVERB_SHOW, NULL, m_lpClientSite, 0, m_hWnd, NULL); 107 108 //redraw the window to show animation 109 RedrawWindow(); 110 111 if (m_lpClientSite) 112 { 113 m_lpClientSite->Release(); 114 m_lpClientSite = NULL; 115 } 116 if (m_lpObject) 117 { 118 m_lpObject->Release(); 119 m_lpObject = NULL; 120 } 121 if (m_lpStorage) 122 { 123 m_lpStorage->Release(); 124 m_lpStorage = NULL; 125 } 126 127 SysFreeString(path); 128 } 129 catch( _com_error e ) 130 { 131 AfxMessageBox(e.ErrorMessage()); 132 ::CoUninitialize(); 133 }
begin try if CreateILockBytesOnHGlobal(0, True, FLockBytes) <> S_OK then begin showmessage('Error to create Global Heap'); exit; end; //建立一个混合文档存取对象 if StgCreateDocfileOnILockBytes(FLockBytes, STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE, 0, FStorage) <> S_OK then begin Showmessage('Error to create storage'); exit; end; //取得RichEdit的接口 Sendmessage(Editor.handle,EM_GETOLEINTERFACE,0,LongInt(@FRTF));
if FRTF.GetClientSite(FClientSite)<>S_OK then begin ShowMessage('Error to get ClentSite'); Exit; end;
CoInitializeEx(nil, COINIT_APARTMENTTHREADED); m_lpAnimator := TGifAnimator.Create(Self); i_GifAnimator := m_lpAnimator.ControlInterface; i_GifAnimator.LoadFromFile('c:/ti.gif'); i_GifAnimator.QueryInterface(IID_IOleObject, m_lpObject); OleSetContainedObject(m_lpObject, True); FillChar(ReObject, SizeOf(ReObject), 0); ReObject.cbStruct := SizeOf(ReObject); m_lpObject.GetUserClassID(clsid); ReObject.clsid := clsid; 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 := FClientSite; //the storage reobject.pstg := FStorage; sizel.cx := 0; sizel.cy := 0; reobject.sizel := sizel; //Sel all text
SendMessage(Editor.Handle, EM_SETSEL, 0, -1); SendMessage(Editor.Handle, EM_GETSEL, dwStart, dwEnd); SendMessage(Editor.Handle, EM_SETSEL, dwEnd + 1, dwEnd + 1); //Insert after the line of text FRTF.InsertObject(reobject); SendMessage(Editor.Handle, EM_SCROLLCARET, 0, 0); //VARIANT_BOOL ret; //do frame changing m_lpAnimator.TriggerFrameChange(); //show it m_lpObject.DoVerb(OLEIVERB_UIACTIVATE, Nil, FClientSite, 0, Editor.Handle,Rect); // m_lpObject.DoVerb( m_lpObject.DoVerb(OLEIVERB_SHOW, Nil, FClientSite, 0, Editor.Handle, Rect); //redraw the window to show animation redrawwindow(Handle, nil, 0, RDW_ERASE or RDW_INVALIDATE or RDW_FRAME or RDW_ERASENOW or RDW_ALLCHILDREN); finally FRTF:=nil; FClientSite := nil; FStorage :=nil; end; end; end 更多内容请看MSN图像 MSN专题 QQ表情专题,或