InsRich.pas 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. unit InsRich;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs,ActiveX,ComCtrls;
  6. const
  7. REO_CP_SELECTION = ULONG(-1);
  8. REO_BELOWBASELINE = $00000002;
  9. REO_RESIZABLE = $00000001;
  10. REO_STATIC = $40000000;
  11. EM_GETOLEINTERFACE = WM_USER + 60;
  12. IID_IUnknown: TGUID = (D1:$00000000;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
  13. IID_IOleObject: TGUID = (D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
  14. type
  15. _ReObject = record
  16. cbStruct: DWORD; { Size of structure }
  17. cp: ULONG; { Character position of Object }
  18. clsid: TCLSID; { Class ID of Object }
  19. pOleObj: IOleObject; { Ole Object interface }
  20. pstg: IStorage; { Associated storage interface }
  21. pOleSite: IOleClientSite; { Associated Client Site interface }
  22. sizel: TSize; { Size of Object (may be 0,0) }
  23. dvAspect: Longint; { Display aspect to use }
  24. dwFlags: DWORD; { Object status flags }
  25. dwUser: DWORD; { Dword for user's use }
  26. end;
  27. TReObject = _ReObject;
  28. TCharRange = record {Copy From RichEdit.pas}
  29. cpMin: Integer;
  30. cpMax: Integer;
  31. end;
  32. TFormatRange = record
  33. hdc: Integer;
  34. hdcTarget: Integer;
  35. rectRegion: TRect;
  36. rectPage: TRect;
  37. chrg: TCharRange;
  38. end;
  39. IRichEditOle = interface(System.IUnknown)
  40. ['{00020d00-0000-0000-c000-000000000046}']
  41. function GetClientSite(out ClientSite: IOleClientSite): HResult; stdcall;
  42. function GetObjectCount: HResult; stdcall;
  43. function GetLinkCount: HResult; stdcall;
  44. function GetObject(iob: Longint; out ReObject: TReObject; dwFlags: DWORD): HResult; stdcall;
  45. function InsertObject(var ReObject: TReObject): HResult; stdcall;
  46. function ConvertObject(iob: Longint; rclsidNew: TIID;lpstrUserTypeNew: LPCSTR): HResult; stdcall;
  47. function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
  48. function SetHostNames(lpstrContainerApp: LPCSTR; lpstrContainerObj: LPCSTR): HResult; stdcall;
  49. function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
  50. function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
  51. function HandsOffStorage(iob: Longint): HResult; stdcall;
  52. function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
  53. function InPlaceDeactivate: HResult; stdcall;
  54. function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
  55. function GetClipboardData(var chrg: TCharRange; reco: DWORD; out dataObj: IDataObject): HResult; stdcall;
  56. function ImportDataObject(dataObj: IDataObject; cf: TClipFormat; hMetaPict: HGLOBAL): HResult; stdcall;
  57. end;
  58. function InsertBitmap(Editor: TRichEdit; BmpFile: String): Boolean;
  59. implementation
  60. function InsertBitmap(Editor: TRichEdit; BmpFile: String): Boolean;
  61. var
  62. FRTF: IRichEditOle;
  63. FOle: IOleObject;
  64. FormatEtc: tagFormatETC;
  65. FStorage: ISTORAGE;
  66. FClientSite: IOleClientSite;
  67. FLockBytes: ILockBytes;
  68. ReObject: TReObject;
  69. xt: TGuid;
  70. FTemp: IUnknown;
  71. begin
  72. Result:=false;
  73. if not FileExists(BmpFile) then Exit;
  74. try
  75. SendMessage(Editor.Handle, em_GetOleInterFace, 0, LongInt(@FRTF));
  76. if not Assigned(FRTF) then Exit;
  77. if CreateILockBytesOnHGlobal(0,true,FLockBytes)<>S_OK then Exit;
  78. if StgCreateDocfileOnILockBytes(FLockBytes,STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE,0,FStorage)<>S_OK then Exit;
  79. FormatEtc.cfFormat:=0;
  80. FormatEtc.ptd:=nil;
  81. FormatEtc.dwAspect:=DVASPECT_CONTENT;
  82. FormatEtc.lindex:=-1;
  83. FormatEtc.tymed:=TYMED_NULL;
  84. FRTF.GetClientSite(FClientSite);
  85. //´ÓÎļþÖд´½¨Ò»¸öOle¶ÔÏó
  86. if OleCreateFromFile(GUID_NULL,PWideChar(WideString(BmpFile)),IID_IUnknown,0,@FormatEtc,FClientSite,FStorage,FOle)<>S_OK then Exit;
  87. FTemp:=FOle;
  88. FTemp.QueryInterface(IID_IOleObject, FOle);
  89. OleSetContainedObject(FOle, true);
  90. ReObject.cbStruct:=SizeOf(TReObject);
  91. FOle.GetUserClassID(xt);
  92. ReObject.clsid:=xt;
  93. ReObject.cp:=ULong(REO_CP_SELECTION);
  94. ReObject.dvaspect:=DVASPECT_CONTENT;
  95. ReObject.dwFlags:=ULong(REO_STATIC) or ULong(REO_BELOWBASELINE);
  96. ReObject.dwUser:=0;
  97. ReObject.pOleObj:=FOle;
  98. ReObject.pOleSite:=FClientSite;
  99. ReObject.pstg:=FStorage;
  100. ReObject.sizel.cx:=0;
  101. ReObject.sizel.cy:=0;
  102. FRTF.InsertObject(ReObject);
  103. finally
  104. FRTF:=nil;
  105. FOle:=nil;
  106. end;
  107. Result:=true;
  108. end;
  109. end.