re_bmp.pas
上传用户:com600
上传日期:2020-07-29
资源大小:2k
文件大小:7k
源码类别:

RichEdit

开发平台:

Delphi

  1. unit re_bmp;
  2. interface
  3. uses Windows;
  4. procedure InsertBitmapToRE(Wnd:HWND; Bmp:HBITMAP);
  5. implementation
  6. uses Activex, RichEdit;
  7. const
  8. IID_IDataObject: TGUID = (
  9.   D1:$0000010E;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
  10. IID_IOleObject: TGUID = (
  11.    D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
  12. REO_CP_SELECTION    = ULONG(-1);
  13. REO_IOB_SELECTION   = ULONG(-1);
  14. REO_GETOBJ_POLEOBJ  =  $00000001;
  15. type
  16. TReobject = record
  17.    cbStruct: DWORD;
  18.    cp: ULONG;
  19.    clsid: TCLSID;
  20.    poleobj: IOleObject;
  21.    pstg: IStorage;
  22.    polesite: IOleClientSite;
  23.    sizel: TSize;
  24.    dvAspect: Longint;
  25.    dwFlags: DWORD;
  26.    dwUser: DWORD;
  27. end;
  28. type
  29. IRichEditOle = interface(IUnknown)
  30.    ['{00020d00-0000-0000-c000-000000000046}']
  31.    function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;
  32.    function GetObjectCount: HResult; stdcall;
  33.    function GetLinkCount: HResult; stdcall;
  34.    function GetObject(iob: Longint; out reobject: TReObject;
  35.      dwFlags: DWORD): HResult; stdcall;
  36.    function InsertObject(var reobject: TReObject): HResult; stdcall;
  37.    function ConvertObject(iob: Longint; rclsidNew: TIID;
  38.      lpstrUserTypeNew: LPCSTR): HResult; stdcall;
  39.    function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
  40.    function SetHostNames(lpstrContainerApp: LPCSTR;
  41.      lpstrContainerObj: LPCSTR): HResult; stdcall;
  42.    function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
  43.    function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
  44.    function HandsOffStorage(iob: Longint): HResult; stdcall;
  45.    function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
  46.    function InPlaceDeactivate: HResult; stdcall;
  47.    function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
  48.    function GetClipboardData(var chrg: TCharRange; reco: DWORD;
  49.      out dataobj: IDataObject): HResult; stdcall;
  50.    function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;
  51.      hMetaPict: HGLOBAL): HResult; stdcall;
  52. end;
  53. TImageDataObject=class(TInterfacedObject,IDataObject)
  54. private
  55.   FBmp:HBITMAP;
  56.   FMedium:TStgMedium;
  57.   FFormatEtc: TFormatEtc;
  58.   procedure SetBitmap(bmp:HBITMAP);
  59.   function GetOleObject(OleClientSite:IOleClientSite; Storage:IStorage):IOleObject;
  60.   destructor Destroy;override;
  61.   // IDataObject
  62.   function GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; stdcall;
  63.    function GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult; stdcall;
  64.    function QueryGetData(const formatetc: TFormatEtc): HResult; stdcall;
  65.    function GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult; stdcall;
  66.    function SetData(const formatetc: TFormatEtc; var medium: TStgMedium; fRelease: BOOL): HResult; stdcall;
  67.    function EnumFormatEtc(dwDirection: Longint; out enumFormatEtc: IEnumFormatEtc): HResult; stdcall;
  68.    function DAdvise(const formatetc: TFormatEtc; advf: Longint; 
  69.                     const advSink: IAdviseSink; out dwConnection: Longint): HResult; stdcall;
  70.    function DUnadvise(dwConnection: Longint): HResult; stdcall;
  71.    function EnumDAdvise(out enumAdvise: IEnumStatData): HResult; stdcall;
  72. public
  73.   procedure InsertBitmap(wnd:HWND; Bitmap:HBITMAP);
  74. end;
  75. { TImageDataObject }
  76. function TImageDataObject.DAdvise(const formatetc: TFormatEtc; advf: Integer;
  77. const advSink: IAdviseSink; out dwConnection: Integer): HResult;
  78. begin
  79. Result:=E_NOTIMPL;
  80. end;
  81.  
  82. function TImageDataObject.DUnadvise(dwConnection: Integer): HResult;
  83. begin
  84. Result:=E_NOTIMPL;
  85. end;
  86. function TImageDataObject.EnumDAdvise(out enumAdvise: IEnumStatData): HResult;
  87. begin
  88. Result:=E_NOTIMPL;
  89. end;
  90. function TImageDataObject.EnumFormatEtc(dwDirection: Integer; out enumFormatEtc: IEnumFormatEtc): HResult;
  91. begin
  92. Result:=E_NOTIMPL;
  93. end;
  94. function TImageDataObject.GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult;
  95. begin
  96. Result:=E_NOTIMPL;
  97. end;
  98. function TImageDataObject.GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult;
  99. begin
  100. Result:=E_NOTIMPL;
  101. end;
  102. function TImageDataObject.QueryGetData(const formatetc: TFormatEtc): HResult;
  103. begin
  104. Result:=E_NOTIMPL;
  105. end;
  106. destructor TImageDataObject.Destroy;
  107. begin
  108. ReleaseStgMedium(FMedium);
  109. end;
  110. function TImageDataObject.GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult;
  111. begin
  112. medium.tymed := TYMED_GDI;
  113. medium.hBitmap :=  FMedium.hBitmap;
  114. medium.unkForRelease := nil;
  115. Result:=S_OK;
  116. end;
  117. function TImageDataObject.SetData(const formatetc: TFormatEtc; var medium: TStgMedium; fRelease: BOOL): HResult;
  118. begin
  119. FFormatEtc := formatetc;
  120. FMedium := medium;
  121. Result:= S_OK;
  122. end;
  123. procedure TImageDataObject.SetBitmap(bmp: HBITMAP);
  124. var
  125. stgm: TStgMedium;
  126. fm:TFormatEtc;
  127. begin
  128. stgm.tymed := TYMED_GDI;
  129. stgm.hBitmap := bmp;
  130. stgm.UnkForRelease := nil;
  131. fm.cfFormat := CF_BITMAP;
  132. fm.ptd := nil;
  133. fm.dwAspect := DVASPECT_CONTENT;
  134. fm.lindex := -1;
  135. fm.tymed := TYMED_GDI;
  136. SetData(fm, stgm, FALSE);
  137. end;
  138.  
  139. function TImageDataObject.GetOleObject(OleClientSite: IOleClientSite; Storage: IStorage):IOleObject;
  140. begin
  141. if (Fmedium.hBitmap=0) then Result:=nil else
  142. OleCreateStaticFromData(self, IID_IOleObject, OLERENDER_FORMAT, @FFormatEtc, OleClientSite, Storage, Result);
  143. end;
  144. procedure TImageDataObject.InsertBitmap(wnd:HWND; Bitmap: HBITMAP);
  145. var
  146. OleClientSite:IOleClientSite;
  147. RichEditOLE:IRichEditOLE;
  148. Storage:IStorage;
  149. LockBytes:ILockBytes;
  150. OleObject:IOleObject;
  151. reobject:TReobject;
  152. clsid:TGUID;
  153. begin
  154. if (SendMessage(wnd, EM_GETOLEINTERFACE, 0, cardinal(@RichEditOle))=0) then exit;
  155. FBmp:=CopyImage(Bitmap,IMAGE_BITMAP,0,0,0);
  156. if FBmp=0 then exit;
  157. try
  158.   SetBitmap(Fbmp);
  159.   RichEditOle.GetClientSite(OleClientSite);
  160.   if (OleClientSite=nil) then exit;
  161.   CreateILockBytesOnHGlobal(0, TRUE,LockBytes);
  162.   if (LockBytes = nil) then exit;
  163.   if (StgCreateDocfileOnILockBytes(LockBytes, STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE, 0,Storage)<> S_OK) then
  164.   begin
  165.      LockBytes._Release;
  166.      exit
  167.    end;
  168.   if (Storage = nil) then exit;
  169.   OleObject:=GetOleObject(OleClientSite, Storage);
  170.   if (OleObject = nil) then exit;
  171.   OleSetContainedObject(OleObject, TRUE);
  172.   ZeroMemory(@reobject, sizeof(TReobject));
  173.   reobject.cbStruct := sizeof(TReobject);
  174.   OleObject.GetUserClassID(clsid);
  175.   reobject.clsid := clsid;
  176.   reobject.cp := REO_CP_SELECTION;
  177.   reobject.dvaspect := DVASPECT_CONTENT;
  178.   reobject.poleobj := OleObject;
  179.   reobject.polesite := OleClientSite;
  180.   reobject.pstg := Storage;
  181.   RichEditOle.InsertObject(reobject);
  182. finally
  183.   DeleteObject(FBmp)
  184. end
  185. end;
  186. procedure InsertBitmapToRE(Wnd:HWND; bmp:HBITMAP);
  187. begin
  188. with TImageDataObject.Create do
  189. try
  190. InsertBitmap(Wnd,Bmp);
  191. finally
  192. Free
  193. end
  194. end;
  195. end. 
  196.