type _ReObject = record cbStruct: DWORD; { Size of structure } cp: ULONG; { Character position of Object } clsid: TCLSID; { Class ID of Object } pOleObj: IOleObject; { Ole Object interface } pstg: IStorage; { Associated storage interface } pOleSite: IOleClientSite; { Associated Client Site interface } sizel: TSize; { Size of Object (may be 0,0) } dvAspect: Longint; { Display aspect to use } dwFlags: DWORD; { Object status flags } dwUser: DWORD; { Dword for user憇 use } end;
TReObject = _ReObject; TCharRange = record {Copy From RichEdit.pas} cpMin: Integer; cpMax: Integer; end;
//*************************************************** //名称:InsertGif //功能:插入图片 //输入:re:RichEdit控件;sFileName:要插入的文件名; // dwUser:(标识,随机数,暂时用文件名【索引】代替) //输出: //返回: //*************************************************** procedure InsertGif(re: TRxRichEdit; sFileName: string; dwUser: integer); type tagSize = TSize; var FRTF: IRichEditOle; FLockBytes: ILockBytes; FStorage: ISTORAGE; FClientSite: IOLECLIENTSITE; m_lpObject: IOleObject; m_lpAnimator: TGifAnimator; i_GifAnimator: IGifAnimator; reobject: TReObject; clsid: TGuid; sizel: tagSize; Rect: TRect; 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(re.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(re); i_GifAnimator := m_lpAnimator.ControlInterface; i_GifAnimator.LoadFromFile(sFileName); 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 re.SelText := ''; re.SelLength := 0; re.SelStart := re.SelStart; reobject.dwUser := dwUser;
//Insert after the line of text FRTF.InsertObject(reobject); SendMessage(re.Handle, EM_SCROLLCARET, 0, 0); //VARIANT_BOOL ret; //do frame changing m_lpAnimator.TriggerFrameChange(); //show it m_lpObject.DoVerb(OLEIVERB_UIACTIVATE, nil, FClientSite, 0, re.Handle, Rect); // m_lpObject.DoVerb( m_lpObject.DoVerb(OLEIVERB_SHOW, nil, FClientSite, 0, re.Handle, Rect); //redraw the window to show animation RedrawWindow(re.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;
//*************************************************** //名称:GetGif //功能:分析控件内容,取得控件中的图片对象 //输入:re:RichEdit控件; //输出: //返回:取得的对象列表(图片索引、图片位置) //*************************************************** function GetGif (re: TRxRichEdit): TList; type tagSize = TSize; var i: integer; FRTF: IRichEditOle; ReObject: TReObject; lstGif: TList; slstRow: TStringList; begin lstGif := TList.Create;
for i := 0 to FRTF.GetObjectCount - 1 do begin slstRow := TStringList.Create; FillChar(ReObject, SizeOf(ReObject), 0); ReObject.cbStruct := SizeOf(ReObject);