Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.10.2008, 15:18
Аватар для kirflaer
kirflaer kirflaer вне форума
Прохожий
 
Регистрация: 11.03.2008
Сообщения: 7
Репутация: 10
По умолчанию Помощь С OLE объектами

Здравствуйсте уважаемые программисты, не обратился бы сюда если до этого не пролазил ни один чаз в гугле, проблема в том что практически нет информации по использованию ole в delphi, а проблема стара как мир, использование картинок в richedit, и код который вставляет битмап в richedit у меня есть (на основе ole объектов), но не могу я использовать код который не понимаю, а при попытке изучения столкнулся с отсутствием инфы по данному вопросу, на очень многих форумах выложен этот код.

Код:
interface
uses Windows;
procedure InsertBitmapToRE(Wnd:HWND; Bmp:HBITMAP);
implementation
uses Activex, RichEdit;
const
IID_IDataObject: TGUID = (
  D1:$0000010E;D2:$0000;D3:$0000;D4:($C0,$00,$00,$00,$00,$00,$00,$46));
IID_IOleObject: TGUID = (
   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;
   cp: ULONG;
   clsid: TCLSID;
   poleobj: IOleObject;
   pstg: IStorage;
   polesite: IOleClientSite;
   sizel: TSize;
   dvAspect: Longint;
   dwFlags: DWORD;
   dwUser: DWORD;
end;

type
IRichEditOle = interface(IUnknown)
   ['{00020d00-0000-0000-c000-000000000046}']
   function GetClientSite(out clientSite: IOleClientSite): HResult; stdcall;
   function GetObjectCount: HResult; stdcall;
   function GetLinkCount: HResult; stdcall;
   function GetObject(iob: Longint; out reobject: TReObject;
     dwFlags: DWORD): HResult; stdcall;
   function InsertObject(var reobject: TReObject): HResult; stdcall;
   function ConvertObject(iob: Longint; rclsidNew: TIID;
     lpstrUserTypeNew: LPCSTR): HResult; stdcall;
   function ActivateAs(rclsid: TIID; rclsidAs: TIID): HResult; stdcall;
   function SetHostNames(lpstrContainerApp: LPCSTR;
     lpstrContainerObj: LPCSTR): HResult; stdcall;
   function SetLinkAvailable(iob: Longint; fAvailable: BOOL): HResult; stdcall;
   function SetDvaspect(iob: Longint; dvaspect: DWORD): HResult; stdcall;
   function HandsOffStorage(iob: Longint): HResult; stdcall;
   function SaveCompleted(iob: Longint; const stg: IStorage): HResult; stdcall;
   function InPlaceDeactivate: HResult; stdcall;
   function ContextSensitiveHelp(fEnterMode: BOOL): HResult; stdcall;
   function GetClipboardData(var chrg: TCharRange; reco: DWORD;
     out dataobj: IDataObject): HResult; stdcall;
   function ImportDataObject(dataobj: IDataObject; cf: TClipFormat;
     hMetaPict: HGLOBAL): HResult; stdcall;
end;
TImageDataObject=class(TInterfacedObject,IDataObject)

private
  FBmp:HBITMAP;
  FMedium:TStgMedium;
  FFormatEtc: TFormatEtc;
  procedure SetBitmap(bmp:HBITMAP);
  function GetOleObject(OleClientSite:IOleClientSite; Storage:IStorage):IOleObject;
  destructor Destroy;override;

 

  // IDataObject
  function GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult; stdcall;
   function GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult; stdcall;
   function QueryGetData(const formatetc: TFormatEtc): HResult; stdcall;

   function GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult; stdcall;

   function SetData(const formatetc: TFormatEtc; var medium: TStgMedium; fRelease: BOOL): HResult; stdcall;
   function EnumFormatEtc(dwDirection: Longint; out enumFormatEtc: IEnumFormatEtc): HResult; stdcall;
   function DAdvise(const formatetc: TFormatEtc; advf: Longint; 
                    const advSink: IAdviseSink; out dwConnection: Longint): HResult; stdcall;
   function DUnadvise(dwConnection: Longint): HResult; stdcall;
   function EnumDAdvise(out enumAdvise: IEnumStatData): HResult; stdcall;
public
  procedure InsertBitmap(wnd:HWND; Bitmap:HBITMAP);
end;

  { TImageDataObject }

function TImageDataObject.DAdvise(const formatetc: TFormatEtc; advf: Integer;
const advSink: IAdviseSink; out dwConnection: Integer): HResult;
begin
Result:=E_NOTIMPL;
end;

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

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

function TImageDataObject.EnumFormatEtc(dwDirection: Integer; out enumFormatEtc: IEnumFormatEtc): HResult;
begin
Result:=E_NOTIMPL;
end;

function TImageDataObject.GetCanonicalFormatEtc(const formatetc: TFormatEtc; out formatetcOut: TFormatEtc): HResult;
begin
Result:=E_NOTIMPL;
end;

function TImageDataObject.GetDataHere(const formatetc: TFormatEtc; out medium: TStgMedium): HResult;
begin
Result:=E_NOTIMPL;
end;

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

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

function TImageDataObject.GetData(const formatetcIn: TFormatEtc; out medium: TStgMedium): HResult;
begin
medium.tymed := TYMED_GDI;
medium.hBitmap :=  FMedium.hBitmap;
medium.unkForRelease := nil;
Result:=S_OK;
end; 

function TImageDataObject.SetData(const formatetc: TFormatEtc; var medium: TStgMedium; fRelease: BOOL): HResult;
begin
FFormatEtc := formatetc;
FMedium := medium;
Result:= S_OK;
end;

procedure TImageDataObject.SetBitmap(bmp: HBITMAP);
var
stgm: TStgMedium;
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(fm, stgm, FALSE);
end;

function TImageDataObject.GetOleObject(OleClientSite: IOleClientSite; Storage: IStorage):IOleObject;
begin
if (Fmedium.hBitmap=0) then Result:=nil else
OleCreateStaticFromData(self, IID_IOleObject, OLERENDER_FORMAT, @FFormatEtc, OleClientSite, Storage, Result);
end;

procedure TImageDataObject.InsertBitmap(wnd:HWND; Bitmap: HBITMAP);
var
OleClientSite:IOleClientSite;
RichEditOLE:IRichEditOLE;
Storage:IStorage;
LockBytes:ILockBytes;
OleObject:IOleObject;
reobject:TReobject;
clsid:TGUID;
begin
if (SendMessage(wnd, EM_GETOLEINTERFACE, 0, cardinal(@RichEditOle))=0) then exit;
FBmp:=CopyImage(Bitmap,IMAGE_BITMAP,0,0,0);
if FBmp=0 then exit;
try
  SetBitmap(Fbmp);
  RichEditOle.GetClientSite(OleClientSite);
  if (OleClientSite=nil) then exit;
  CreateILockBytesOnHGlobal(0, TRUE,LockBytes);
  if (LockBytes = nil) then exit;
  if (StgCreateDocfileOnILockBytes(LockBytes, STGM_SHARE_EXCLUSIVE or STGM_CREATE or STGM_READWRITE, 0,Storage)<> S_OK) then
  begin
     LockBytes._Release;
     exit
   end; 

  if (Storage = nil) then exit;
  OleObject:=GetOleObject(OleClientSite, Storage);
  if (OleObject = nil) then exit;
  OleSetContainedObject(OleObject, TRUE); 
  ZeroMemory(@reobject, sizeof(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:HWND; bmp:HBITMAP);
begin
with TImageDataObject.Create do
try
InsertBitmap(Wnd,Bmp);
finally
Free
end
end; 

end.
Ответить с цитированием
  #2  
Старый 14.10.2008, 10:55
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Используйте библиотеку RXLibrary и будет вам счастье. Там есть компонент RxRichEdit, который позволяет вставлять картинки.
__________________
Хорошо написанная программа не требует документации
ICQ 9-184-668.
Ответить с цитированием
  #3  
Старый 15.10.2008, 07:25
Аватар для kirflaer
kirflaer kirflaer вне форума
Прохожий
 
Регистрация: 11.03.2008
Сообщения: 7
Репутация: 10
По умолчанию

По мойму я говорил именно о Richedit, а не о компонентах Rx*, но проблема на стадии решения
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter