<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=122578&amp;view=findpost&amp;p=921991</guid>
        <pubDate>Sun, 20 Nov 2005 00:48:44 +0000</pubDate>
        <title>Как вставить Bitmap в TRichEdit</title>
        <link>https://forum.sources.ru/index.php?showtopic=122578&amp;view=findpost&amp;p=921991</link>
        <description><![CDATA[Krid: Вот так можно вставить картинку в формате Bitmap в позицию курсора в TRichEdit:<br>
<br>
<strong class='tag-b'>re_bmp.pas</strong><br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">unit re_bmp;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">uses Windows;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure InsertBitmapToRE(Wnd:HWND; Bmp:HBITMAP);</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">uses Activex, RichEdit;</div><div class="code_line">&nbsp;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;IID_IDataObject: TGUID = (</div><div class="code_line">&nbsp;&nbsp; D1:{text}00010E;D2:{text}00;D3:{text}00;D4:($C0,{text},{text},{text},{text},{text},{text},));</div><div class="code_line">&nbsp;&nbsp;IID_IOleObject: TGUID = (</div><div class="code_line">&nbsp;&nbsp; &nbsp;D1:{text}000112;D2:{text}00;D3:{text}00;D4:($C0,{text},{text},{text},{text},{text},{text},));</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;REO_CP_SELECTION &nbsp; &nbsp;= ULONG(-1);</div><div class="code_line">&nbsp;&nbsp;REO_IOB_SELECTION &nbsp; = ULONG(-1);</div><div class="code_line">&nbsp;&nbsp;REO_GETOBJ_POLEOBJ &nbsp;= &nbsp;{text}000001;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TReobject = record</div><div class="code_line">&nbsp;&nbsp; &nbsp;cbStruct: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;cp: ULONG;</div><div class="code_line">&nbsp;&nbsp; &nbsp;clsid: TCLSID;</div><div class="code_line">&nbsp;&nbsp; &nbsp;poleobj: IOleObject;</div><div class="code_line">&nbsp;&nbsp; &nbsp;pstg: IStorage;</div><div class="code_line">&nbsp;&nbsp; &nbsp;polesite: IOleClientSite;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sizel: TSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dvAspect: Longint;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwFlags: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp;dwUser: DWORD;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;IRichEditOle = interface(IUnknown)</div><div class="code_line">&nbsp;&nbsp; &nbsp;[&#39;{00020d00-0000-0000-c000-000000000046}&#39;]</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetObjectCount: HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetLinkCount: HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetObject(iob: Longint; out reobject: TReObject;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;dwFlags: DWORD): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function InsertObject(var reobject: TReObject): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ConvertObject(iob: Longint; rclsidNew: TIID;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lpstrUserTypeNew: LPCSTR): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SetHostNames(lpstrContainerApp: LPCSTR;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;lpstrContainerObj: LPCSTR): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function HandsOffStorage(iob: Longint): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function InPlaceDeactivate: HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetClipboardData(var chrg: TCharRange; reco: DWORD;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;out dataobj: IDataObject): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;hMetaPict: HGLOBAL): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;TImageDataObject=class(TInterfacedObject,IDataObject)</div><div class="code_line">&nbsp;&nbsp;private</div><div class="code_line">&nbsp;&nbsp; FBmp:HBITMAP;</div><div class="code_line">&nbsp;&nbsp; FMedium:TStgMedium;</div><div class="code_line">&nbsp;&nbsp; FFormatEtc: TFormatEtc;</div><div class="code_line">&nbsp;&nbsp; procedure SetBitmap(bmp:HBITMAP);</div><div class="code_line">&nbsp;&nbsp; function GetOleObject(OleClientSite:IOleClientSite; Storage:IStorage):IOleObject;</div><div class="code_line">&nbsp;&nbsp; destructor Destroy;override;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // IDataObject</div><div class="code_line">&nbsp;&nbsp; function GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function QueryGetData(const formatetc: TFormatEtc): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function SetData(const formatetc: TFormatEtc; var medium: TStgMedium; fRelease: BOOL): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function EnumFormatEtc(dwDirection: Longint; out enumFormatEtc: IEnumFormatEtc): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DAdvise(const formatetc: TFormatEtc; advf: Longint; </div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; const advSink: IAdviseSink; out dwConnection: Longint): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function DUnadvise(dwConnection: Longint): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp; &nbsp;function EnumDAdvise(out enumAdvise: IEnumStatData): HResult; stdcall;</div><div class="code_line">&nbsp;&nbsp;public</div><div class="code_line">&nbsp;&nbsp; procedure InsertBitmap(wnd:HWND; Bitmap:HBITMAP);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">{ TImageDataObject }</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.DAdvise(const formatetc: TFormatEtc; advf: Integer;</div><div class="code_line">&nbsp;&nbsp;const advSink: IAdviseSink; out dwConnection: Integer): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.DUnadvise(dwConnection: Integer): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.EnumDAdvise(out enumAdvise: IEnumStatData): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.EnumFormatEtc(dwDirection: Integer; out enumFormatEtc: IEnumFormatEtc): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.QueryGetData(const formatetc: TFormatEtc): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;Result:=E_NOTIMPL;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">destructor TImageDataObject.Destroy;</div><div class="code_line">begin</div><div class="code_line">&nbsp;ReleaseStgMedium(FMedium);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;medium.tymed := TYMED_GDI;</div><div class="code_line">&nbsp;medium.hBitmap := &nbsp;FMedium.hBitmap;</div><div class="code_line">&nbsp;medium.unkForRelease := nil;</div><div class="code_line">&nbsp;Result:=S_OK;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.SetData(const formatetc: TFormatEtc; var medium: TStgMedium; fRelease: BOOL): HResult;</div><div class="code_line">begin</div><div class="code_line">&nbsp;FFormatEtc := formatetc;</div><div class="code_line">&nbsp;FMedium := medium;</div><div class="code_line">&nbsp;Result:= S_OK;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TImageDataObject.SetBitmap(bmp: HBITMAP);</div><div class="code_line">var</div><div class="code_line">&nbsp;stgm: TStgMedium;</div><div class="code_line">&nbsp;fm:TFormatEtc;</div><div class="code_line">begin</div><div class="code_line">&nbsp;stgm.tymed := TYMED_GDI;</div><div class="code_line">&nbsp;stgm.hBitmap := bmp;</div><div class="code_line">&nbsp;stgm.UnkForRelease := nil;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;fm.cfFormat := CF_BITMAP;</div><div class="code_line">&nbsp;fm.ptd := nil;</div><div class="code_line">&nbsp;fm.dwAspect := DVASPECT_CONTENT;</div><div class="code_line">&nbsp;fm.lindex := -1;</div><div class="code_line">&nbsp;fm.tymed := TYMED_GDI;</div><div class="code_line">&nbsp;SetData(fm, stgm, FALSE);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">function TImageDataObject.GetOleObject(OleClientSite: IOleClientSite; Storage: IStorage):IOleObject;</div><div class="code_line">begin</div><div class="code_line">&nbsp;if (Fmedium.hBitmap=0) then Result:=nil else</div><div class="code_line">&nbsp;&nbsp;OleCreateStaticFromData(self, IID_IOleObject, OLERENDER_FORMAT, @FFormatEtc, OleClientSite, Storage, Result);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TImageDataObject.InsertBitmap(wnd:HWND; Bitmap: HBITMAP);</div><div class="code_line">var</div><div class="code_line">&nbsp;OleClientSite:IOleClientSite;</div><div class="code_line">&nbsp;RichEditOLE:IRichEditOLE;</div><div class="code_line">&nbsp;Storage:IStorage;</div><div class="code_line">&nbsp;LockBytes:ILockBytes;</div><div class="code_line">&nbsp;OleObject:IOleObject;</div><div class="code_line">&nbsp;reobject:TReobject;</div><div class="code_line">&nbsp;clsid:TGUID;</div><div class="code_line">begin</div><div class="code_line">&nbsp;if (SendMessage(wnd, EM_GETOLEINTERFACE, 0, cardinal(@RichEditOle))=0) then exit;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;FBmp:=CopyImage(Bitmap,IMAGE_BITMAP,0,0,0);</div><div class="code_line">&nbsp;if &nbsp;FBmp=0 then exit;</div><div class="code_line">&nbsp;try</div><div class="code_line">&nbsp;&nbsp; SetBitmap(Fbmp);</div><div class="code_line">&nbsp;&nbsp; RichEditOle.GetClientSite(OleClientSite);</div><div class="code_line">&nbsp;&nbsp; if (OleClientSite=nil) then exit;</div><div class="code_line">&nbsp;&nbsp; CreateILockBytesOnHGlobal(0, TRUE,LockBytes);</div><div class="code_line">&nbsp;&nbsp; if (LockBytes = nil) then exit;</div><div class="code_line">&nbsp;&nbsp; if (StgCreateDocfileOnILockBytes(LockBytes, STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE, 0,Storage)&#60;&#62; S_OK) then</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;LockBytes._Release;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit</div><div class="code_line">&nbsp;&nbsp; &nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; if (Storage = nil) then exit;</div><div class="code_line">&nbsp;&nbsp; OleObject:=GetOleObject(OleClientSite, Storage);</div><div class="code_line">&nbsp;&nbsp; if (OleObject = nil) then exit;</div><div class="code_line">&nbsp;&nbsp; OleSetContainedObject(OleObject, TRUE);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; ZeroMemory(@reobject, sizeof(TReobject));</div><div class="code_line">&nbsp;&nbsp; reobject.cbStruct := sizeof(TReobject);</div><div class="code_line">&nbsp;&nbsp; OleObject.GetUserClassID(clsid);</div><div class="code_line">&nbsp;&nbsp; reobject.clsid := clsid;</div><div class="code_line">&nbsp;&nbsp; reobject.cp := REO_CP_SELECTION;</div><div class="code_line">&nbsp;&nbsp; reobject.dvaspect := DVASPECT_CONTENT;</div><div class="code_line">&nbsp;&nbsp; reobject.poleobj := OleObject;</div><div class="code_line">&nbsp;&nbsp; reobject.polesite := OleClientSite;</div><div class="code_line">&nbsp;&nbsp; reobject.pstg := Storage;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; RichEditOle.InsertObject(reobject);</div><div class="code_line">&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; DeleteObject(FBmp)</div><div class="code_line">&nbsp;end</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure InsertBitmapToRE(Wnd:HWND; bmp:HBITMAP);</div><div class="code_line">begin</div><div class="code_line">&nbsp;with TImageDataObject.Create do</div><div class="code_line">&nbsp;try</div><div class="code_line">&nbsp;&nbsp;InsertBitmap(Wnd,Bmp);</div><div class="code_line">&nbsp;finally</div><div class="code_line">&nbsp;&nbsp;Free</div><div class="code_line">&nbsp;end</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Примеры использования:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">uses re_bmp;</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.Button1Click(Sender: TObject);</div><div class="code_line">begin</div><div class="code_line">&nbsp;InsertBitmapToRE(RichEdit1.Handle,Image1.Picture.Bitmap.Handle);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">...</div><div class="code_line">&nbsp;</div><div class="code_line">procedure TForm1.Button2Click(Sender: TObject);</div><div class="code_line">var</div><div class="code_line">&nbsp;bmp:TBitmap;</div><div class="code_line">begin</div><div class="code_line">&nbsp;if (not OpenPictureDialog1.Execute) then exit;</div><div class="code_line">&nbsp;bmp:=TBitmap.Create;</div><div class="code_line">&nbsp;try</div><div class="code_line">&nbsp;&nbsp; bmp.LoadFromFile(OpenPictureDialog1.Filename);</div><div class="code_line">&nbsp;&nbsp; InsertBitmapToRE(RichEdit1.Handle,bmp.Handle);</div><div class="code_line">&nbsp;finally</div><div class="code_line">&nbsp;&nbsp; bmp.Free</div><div class="code_line">&nbsp;end</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Таким же образом можно вставлять картинки не только в TRichEdit, но и в RxRichEdit, стандартный виндовый RichEdit, etc.<br>
<br>
<strong class='tag-b'>Автор:</strong> <a class='tag-url' href='http://forum.sources.ru/index.php?showuser=12367' target='_blank'>Krid</a>]]></description>
        <author>Krid</author>
        <category>ActiveX, COM, DCOM, CORBA, MIDAS, интерфейсы, OLE, DDE</category>
      </item>
	
      </channel>
      </rss>
	