Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Картинки в RichEdit'e, вместо букв! 
:(
    Опции темы
Диас
Дата 4.8.2006, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Здравствуйте! Проблема такая: необходимо, чтобы в RichEdit'е, при наборе текста появлялись не бквы, а определенные картинки. Но при этом надо, чтобы их можно было также выделять, копировать и вставлять. И чтобы RichEdit.Text выдавал обычный набранный текст. Возможно ли это??? smile 
(На форуме удалось найти тему, где картинку встраивали в RichEdit через rtf, но это не работает, наверно потому что там RxRichEdit smile Хотя никакой ошибки не выдает, но и картинка не появляется.)

Или что-нибудь наподобии смайликов на форуме - определенный набор символов заменяется картинкой.
Если у кого-нибудь есть соображения прошу поделиться. smile 
PM MAIL   Вверх
Snowy
Дата 4.8.2006, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Или свой собственный контрол пиши, или нарисуй свой ttf-фонт.
PM MAIL   Вверх
Alexeis
Дата 4.8.2006, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



нужно пробегать по тексту от начала строки до позиции изменения и проверять на попадание заданного текстового фрагмента в строку, после каждого нажатия. Если попадает, то заменить текст картинкой, Затем записать в какой нибудь динамический масив позицию замены и код изображения. при копировании текста, неужно будет сделать обратную замену.
Картинки можно вставлять и в обычный RichEdit, вот модуль который это делает.
Код

unit re_bmp;

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.


и пример работы

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
InsertBitmapToRE(RichEdit1.Handle,Image1.Picture.Bitmap.Handle);
end;


(взято из http://forum.codeby.net/topic8285.html?pid...amp;#entry38786)


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Диас
Дата 4.8.2006, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



спасибо за советы!  smile  Буду рассматривать оба варианта.
В случае создания собственного ttf - можно ли создать анимированный шрифт?
И если не сложно подскажите пригодную для этого прогу?.
PM MAIL   Вверх
Диас
Дата 19.8.2006, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Как сделать анимированную картинку? И что-бы можнобыло прокрутить одну анимацию 1 раз, а потом другую зациклить.
PM MAIL   Вверх
Alexeis
Дата 19.8.2006, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Диас @  19.8.2006,  22:16 Найти цитируемый пост)
И что-бы можнобыло прокрутить одну анимацию 1 раз

Это смотря какой метод создания анимации использовать. GIF, FLASH, AVI ?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Диас
Дата 22.8.2006, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Скорей всего Gif. Хотя сейчас можно еще выбрать любой - самый приемлимый и оптимальный.
PM MAIL   Вверх
Alexeis
Дата 22.8.2006, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



В RXLib имеется специальный компонент для отображения Gif

Это сообщение отредактировал(а) alexeis1 - 22.8.2006, 00:32


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Диас
Дата 25.8.2006, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



В случае создания собственного ttf - можно ли создать анимированный шрифт?
И если не сложно подскажите пригодную для этого прогу?. 
PM MAIL   Вверх
Snowy
Дата 25.8.2006, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



Шрифты не бывают анимированными.
PM MAIL   Вверх
Диас
Дата 28.8.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Цитата

Или свой собственный контрол пиши, или нарисуй свой ttf-фонт.


Можно ли пользоваться своим шрифтом, но при этом, чтоб он не был установлен в систему - чтоб в других приложениях им нельзя было пользоваться??? 
PM MAIL   Вверх
Snowy
Дата 28.8.2006, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 18
Всего: 484



AddFontResource, RemoveFontResource.
PM MAIL   Вверх
Диас
Дата 28.8.2006, 10:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Да, но после добавления шрифта в Worde можно пользоваться им! Нет ли возможности, чтоб только моя программа видела шрифт???
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.1273 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.