![]() |
|
#1
|
|||
|
|||
![]() Подскажите пожалуйста, как сделать так чтобы в RichEdit выводиль смайлы? А точнее картинки...
Алгоритм примерно такой, массив записей в котором хранится внешний вид смайла и путь к нему, в строке при выводе ищется положение смайли и текст меняется на картинку. Вот все ясно кроме картинки |
#2
|
|||
|
|||
![]() Есть идеи?
|
#3
|
||||
|
||||
![]() По поему TRichEdit картинки не выдает
![]() — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#4
|
|||
|
|||
![]() вот юнит, который позволяет вставлять картинки в RichEdit:
Код:
unit RTFWorks; 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 сюда постил. |
#5
|
|||
|
|||
![]() Спасибо разобрался)
|
#6
|
|||
|
|||
![]() Столкнулся с такой непоняткой (((
Есть текст, типа "Привет! =) Как дела? :-)" Необходимо вместо текствого смайлика вставлять картинку... Причем все хранится в массиве Smiles состоящего из Name (текстовый вид смайлика) и Picture (картинка битмэп). Так вот, если смайлик в тексте один то все просто, находишь функцией Pos место, разбиваешь на две строки и тп... А вот как делать если их несколько? |
#7
|
|||
|
|||
![]() Все, сам разобрался...)))
Как можно сделать чтобы свойство Transparent и TransparentColor для картинок работали и корректно отображались? |