Форум программистов
 
Регистрация на форуме тут, о проблемах пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме 15-35 тыс рублей в месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.12.2013, 05:49   #1
Turbik
Новичок
Джуниор
 
Регистрация: 19.08.2012
Сообщений: 2
Вопрос TBitMap в RichEdit

Доброго времени всем, необходимо вставить TBitMap в TRichEdit нашел для этого действа код:

PHP код:
unit re_bmp;

interface

uses Windows;

procedure InsertBitmapToRE(Wnd:HWNDBmp:HBITMAP);

implementation

uses Activex
RichEdit;


const
 
IID_IDataObjectTGUID = (D1:$0000010E;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
 
IID_IOleObjectTGUID = (D1:$00000112;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));


 
REO_CP_SELECTION    ULONG(-1);
 
REO_IOB_SELECTION   ULONG(-1);
 
REO_GETOBJ_POLEOBJ  =  $00000001;

type
 TReobject 
record
   cbStruct
DWORD;
   
cpULONG;
   
clsidTCLSID;
   
poleobjIOleObject;
   
pstgIStorage;
   
polesiteIOleClientSite;
   
sizelTSize;
   
dvAspectLongint;
   
dwFlagsDWORD;
   
dwUserDWORD;
end;


type

IRichEditOle 
= interface(IUnknown)
   [
'{00020d00-0000-0000-c000-000000000046}']
   function 
GetClientSite(out clientSiteIOleClientSite): HResultstdcall;
   function 
GetObjectCountHResultstdcall;
   function 
GetLinkCountHResultstdcall;
   function 
GetObject(iobLongintout reobjectTReObject;dwFlagsDWORD): HResultstdcall;
   function 
InsertObject(var reobjectTReObject): HResultstdcall;
   function 
ConvertObject(iobLongintrclsidNewTIID;lpstrUserTypeNewLPCSTR): HResultstdcall;
   function 
ActivateAs(rclsidTIIDrclsidAsTIID): HResultstdcall;
   function 
SetHostNames(lpstrContainerAppLPCSTR;lpstrContainerObjLPCSTR): HResultstdcall;
   function 
SetLinkAvailable(iobLongintfAvailableBOOL): HResultstdcall;
   function 
SetDvaspect(iobLongintdvaspectDWORD): HResultstdcall;
   function 
HandsOffStorage(iobLongint): HResultstdcall;
   function 
SaveCompleted(iobLongint; const stgIStorage): HResultstdcall;
   function 
InPlaceDeactivateHResultstdcall;
   function 
ContextSensitiveHelp(fEnterModeBOOL): HResultstdcall;
   function 
GetClipboardData(var chrgTCharRangerecoDWORD;out dataobjIDataObject): HResultstdcall;
   function 
ImportDataObject(dataobjIDataObjectcfTClipFormat;hMetaPictHGLOBAL): HResultstdcall;
end;

TImageDataObject=class(TInterfacedObject,IDataObject)

private
  
FBmp:HBITMAP;
  
FMedium:TStgMedium;
  
FFormatEtcTFormatEtc;
  
procedure SetBitmap(bmp:HBITMAP);
  function 
GetOleObject(OleClientSite:IOleClientSiteStorage:IStorage):IOleObject;
  
destructor Destroy;override;
  function 
GetData(const formatetcInTFormatEtcout mediumTStgMedium): HResultstdcall;
  function 
GetDataHere(const formatetcTFormatEtcout mediumTStgMedium): HResultstdcall;
  function 
QueryGetData(const formatetcTFormatEtc): HResultstdcall;
  function 
GetCanonicalFormatEtc(const formatetcTFormatEtcout formatetcOutTFormatEtc): HResultstdcall;
  function 
SetData(const formatetcTFormatEtc; var mediumTStgMediumfReleaseBOOL): HResultstdcall;
  function 
EnumFormatEtc(dwDirectionLongintout enumFormatEtcIEnumFormatEtc): HResultstdcall;
  function 
DAdvise(const formatetcTFormatEtcadvfLongint;const advSinkIAdviseSinkout dwConnectionLongint): HResultstdcall;
  function 
DUnadvise(dwConnectionLongint): HResultstdcall;
  function 
EnumDAdvise(out enumAdviseIEnumStatData): HResultstdcall;
public
  
procedure InsertBitmap(wnd:HWNDBitmap:HBITMAP);
end;

TImageDataObject 
Turbik вне форума Ответить с цитированием
Старый 20.12.2013, 05:49   #2
Turbik
Новичок
Джуниор
 
Регистрация: 19.08.2012
Сообщений: 2
По умолчанию

PHP код:
function TImageDataObject.DAdvise(const formatetcTFormatEtcadvfInteger;
const 
advSinkIAdviseSinkout dwConnectionInteger): HResult;
begin
Result
:=E_NOTIMPL;
end;

function 
TImageDataObject.DUnadvise(dwConnectionInteger): HResult;
begin
Result
:=E_NOTIMPL;
end;

function 
TImageDataObject.EnumDAdvise(out enumAdviseIEnumStatData): HResult;
begin
Result
:=E_NOTIMPL;
end;

function 
TImageDataObject.EnumFormatEtc(dwDirectionIntegerout enumFormatEtcIEnumFormatEtc): HResult;
begin
Result
:=E_NOTIMPL;
end;


function 
TImageDataObject.GetCanonicalFormatEtc(const formatetcTFormatEtcout formatetcOutTFormatEtc): HResult;
begin
Result
:=E_NOTIMPL;
end;


function 
TImageDataObject.GetDataHere(const formatetcTFormatEtcout mediumTStgMedium): HResult;
begin
Result
:=E_NOTIMPL;
end;

function 
TImageDataObject.QueryGetData(const formatetcTFormatEtc): HResult;
begin
Result
:=E_NOTIMPL;
end;

destructor TImageDataObject.Destroy;
begin
ReleaseStgMedium
(FMedium);
end;


function 
TImageDataObject.GetData(const formatetcInTFormatEtcout mediumTStgMedium): HResult;
begin
medium
.tymed := TYMED_GDI;
medium.hBitmap :=  FMedium.hBitmap;
medium.unkForRelease := nil;
Result:=S_OK;
end;

 

function 
TImageDataObject.SetData(const formatetcTFormatEtc; var mediumTStgMediumfReleaseBOOL): HResult;
begin
FFormatEtc 
:= formatetc;
FMedium := medium;
Result:= S_OK;
end;


procedure TImageDataObject.SetBitmap(bmpHBITMAP);
var
stgmTStgMedium;
fm:TFormatEtc;
begin
stgm
.tymed := TYMED_GDI;
stgm.hBitmap := bmp;
stgm.UnkForRelease := nil;
fm.cfFormat := CF_BITMAP;
fm.ptd := nil;
fm.dwAspect := DVASPECT_CONTENT;
fm.lindex := -1;
fm.tymed := TYMED_GDI;
SetData(fmstgmFALSE);
end;

 
function 
TImageDataObject.GetOleObject(OleClientSiteIOleClientSiteStorageIStorage):IOleObject;
begin
if (Fmedium.hBitmap=0then Result:=nil else
OleCreateStaticFromData(selfIID_IOleObjectOLERENDER_FORMAT, @FFormatEtcOleClientSiteStorageResult);
end;

 

procedure TImageDataObject.InsertBitmap(wnd:HWNDBitmapHBITMAP);
var
OleClientSite:IOleClientSite;
RichEditOLE:IRichEditOLE;
Storage:IStorage;
LockBytes:ILockBytes;
OleObject:IOleObject;
reobject:TReobject;
clsid:TGUID;
begin
if (SendMessage(wndEM_GETOLEINTERFACE0cardinal(@RichEditOle))=0then exit;

FBmp:=CopyImage(Bitmap,IMAGE_BITMAP,0,0,0);
if 
FBmp=0 then exit;
try
  
SetBitmap(Fbmp);
  
RichEditOle.GetClientSite(OleClientSite);
  if (
OleClientSite=nilthen exit;
  
CreateILockBytesOnHGlobal(0TRUE,LockBytes);
  if (
LockBytes nilthen exit;
  if (
StgCreateDocfileOnILockBytes(LockBytesSTGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE0,Storage)<> S_OKthen
     begin
     LockBytes
._Release;
     exit
     
end;

  if (
Storage nilthen exit;
  
OleObject:=GetOleObject(OleClientSiteStorage);
  if (
OleObject nilthen exit;

  
OleSetContainedObject(OleObjectTRUE);
  
ZeroMemory(@reobjectsizeof(TReobject));
  
reobject.cbStruct := sizeof(TReobject);
  
OleObject.GetUserClassID(clsid);
  
reobject.clsid := clsid;
  
reobject.cp := REO_CP_SELECTION;
  
reobject.dvaspect := DVASPECT_CONTENT;
  
reobject.poleobj := OleObject;
  
reobject.polesite := OleClientSite;
  
reobject.pstg := Storage;

  
RichEditOle.InsertObject(reobject);
finally
  
DeleteObject(FBmp)
end
end
;



procedure InsertBitmapToRE(Wnd:HWNDbmp:HBITMAP);
begin
with TImageDataObject
.Create do
try
InsertBitmap(Wnd,Bmp);
finally
Free
end
end
;



end
PHP код:
if OpenPictureDialog1.Execute then
    begin
    Image1
.Picture.LoadFromFile(OpenPictureDialog1.FileName);
    
InsertBitmapToRE(RichEdit1.HandleImage1.Picture.Bitmap.Handle);
    
end 
Все отлично работает, ну требуется еще обрабатывать событие OnClick на вставленную TBitMap и передать какой либо параметр об индентификации этой TBitMap скажем присвоить ей имя или Handle что бы внутри процедуры OnClick понять по какому именно изображению сделан клик (Так как их может быть много в одном RichEdit) , программирую в основном на WinApi очень редко сталкиваюсь с работой по интерфейсам, подскажите люди добрые куда копать что делать!
Turbik вне форума Ответить с цитированием
Ответ
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
TBitmap stalker1995s Общие вопросы Delphi 2 08.03.2013 17:23
Загрузка в RichEdit текста из файла, и получение его из RichEdit Byurrer Общие вопросы C/C++ 1 09.04.2011 09:17
Проблема с TBitmap ImmortalAlexSan Общие вопросы Delphi 2 29.08.2010 09:52
Вставка изображения с RichEdit в RichEdit Sensizu Компоненты Delphi 2 01.10.2009 17:11
TBitmap odi_noki Мультимедиа в Delphi 17 25.10.2008 08:53

Реклама для незарегистрированных, регистрация на форуме