![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
принцип вставления смайликов в ICQ.
Elvis © (2005-06-03 12:43:00)Расскажите мне пожалуйста по какому принципу вставляются смайлики в ICQ.
И тот кто получает сообщение видит смайлик который был вставлен .....
Eraser (2005-06-04 13:39:00) [1]аматор © (04.06.05 10:40) [57]
Да видел я уже эти исходники, там необычно сделана вставка смайла, но распознвания нету.
Спасибо всё равно!
аматор (2005-06-04 10:40:00) [2]ссори сылки сплутал http://dmess.ytu.ru/
аматор (2005-06-04 10:37:00) [3]http://www.everaldo.com/- эт прога смахивающая на аську
зайди и полазь
там даже исходники
Eraser (2005-06-03 23:59:00) [4]Игорь Шевченко © (03.06.05 23:50) [54]
Статья хорошая, правда в моём случае нужен OLEDragNDrop.
Игорь Шевченко (2005-06-03 23:50:00) [5]
> Если у кого есть полезные ссылки по этой теме
Есть статья MBo на этом сайте в разделе "Статьи"
Eraser (2005-06-03 23:38:00) [6]Игорь Шевченко © (03.06.05 23:31) [52]
Чтож - логично... похоже на правду, почему бы и нет... Буду подробно разбираться в механизме dragNdrop.
Если у кого есть полезные ссылки по этой теме, буду признателен.
Игорь Шевченко (2005-06-03 23:31:00) [7]
> на текст, но вопрос в том, откуда она ICQ узнала о том,
> что перетаскивается именно объект, обозначающий какой-то
> конкретный определённый смайлик
Определила, в какой позиции в RichEdit был перетаскиваемый объект, рассчитала длину текста, проанализировала текст в этом месте, отдала.
Eraser (2005-06-03 23:14:00) [8]Игорь Шевченко © (03.06.05 23:05) [50]
Так я ж имею ввиду обратный процесс. Возмём для "понятности" ту же ICQ.
Имеется контрол ввода сообщения, которое нужо отправить. Имеется меню, в котором отображены смайлика. Мы вибираем из этого меню нужный смайлик и он в графическомвиде отображается на контроле ввода. Далее наводим мышу на этот смайлик и перетаскиваем в WordPad, там отображается смайлик в текстовом виде, т.е. :-).
Понятно что в момент начала операции dragNdrop ICQ подменила выделенный OLE объект-рисунок, на текст, но вопрос в том, откуда она ICQ узнала о том, что перетаскивается именно объект, обозначающий какой-то конкретный определённый смайлик ":-)"? Меня интерсует именно техническая сторона вопроса...
Игорь Шевченко (2005-06-03 23:05:00) [9]Eraser © (03.06.05 22:57) [49]
Пользователь, когда перетаскивает, уведомляет RichEdit, что произошло событие. RichEdit уведомляет программу, что на него что-то перетащили. При этом событии программа знает, какой объект перетаскивается, и программе же не затруднит в текст для отправки вставить нужную комбинацию символов и отобразить в RichEdit'е картинку вместо этой комбинации. То есть, RichEdit сам при перетаскивании на него картинки никакую картинку не вставит, насколько мне известно, такой функциональности в нем не предусмотрено.
Eraser (2005-06-03 22:57:00) [10]Игорь Шевченко © (03.06.05 22:49) [48]
HTML - это данные.
RichEdit - элемент отображения данных.
Да эт я прекрасно понимаю. Проблема в том, что RichEdit является не только элементом отображения данных, но и инструментом взаимодействия с этими данными, т.е. их формирования.
Возьмём опять же пример с перетаскиванием. Пользователь ведь не нажимает, какую-то "левую" кнопку, чтобы перетащить выделеный смайл на другой контрол, он перетаскивает ОТОБРАЖАЕМЫЙ элимент..., в свою очередь RichEdit (т.е. интерфейс взаимодействия) может подменить этот элимент нужными текстовыми данными.
Проблема в том, что я не знаю как пользоваться этой "интерфейсной" возможность.
Игорь Шевченко (2005-06-03 22:49:00) [11]Eraser © (03.06.05 22:33) [47]
HTML - это данные.
RichEdit - элемент отображения данных.
Неужели трудно увидеть разницу ? Например, если тебе нужно передать данные для построения диаграммы в Excel, ты же передаешь набор значений, а не снимаешь ее изображение Print Screen'ом, и не передаешь получившееся изображение, правильно ?
Тоже самое и тут - то, что передается, отличается от того, каким образом оно отображается.
> аська и VyPress Chat построены на RichEdit
Глупости. Аська использует RichEdit для отображения данных. С таким же успехом я могу принимать аськины данные своим приложением и отображать их в окне консоли, без картинок-смайликов, правда, но и хрен бы с ними, главное, что сообщение будет передано и принято.
Eraser (2005-06-03 22:33:00) [12]Игорь Шевченко © (03.06.05 22:20) [46]
Эх... хотелось бы отправлять! ) Да где его взять то.
Тем более трюки в ICQ с перетаскиванием смайлика на другой контрол, о которых я писАл наводят на мысль, что инф-я о смайлики хранится в самом объекте рисунке, и этот объект имеет свойство в котором эта инфа хранится, а не в каком-то стороннем массиве с координатами.
ИМХО есть способ без изобретения велосипедов.
К сожалению с OLE знаком очень плохо.. :*(
Игорь Шевченко © (03.06.05 21:50) [44]
Hint: html-страницы внутрь себя картинку не вставляют, являясь текстом :) В них картинка указывается именем файла. Тебе проще, так как набор смайликов ограничен, то для того, чтобы вставить смайлик, достаточно его кода (например ":)"), по которому ты его однозначно идентифицируешь.
Насчёт HTML я подумывал, но пока что считаю, что RichEdit использовать удобнее. Тем более подкуает, что аська и VyPress Chat построены на RichEdit, а это лучшие прграммы в своих областях.
Игорь Шевченко (2005-06-03 22:20:00) [13]
> Проанализировал, вставил.
> А вот дальше проблема. Как отправалять данный текст.
А ты отправляй не тот, который отображается, а тот, который анализируешь.
Eraser (2005-06-03 22:12:00) [14]Игорь Шевченко © (03.06.05 21:50) [44]
ищещь способ вставить в RichEdit картинку
Нашёл. Метод InsertBitmap, основанный на технологии OLE.
procedure TJvCustomRichEdit.InsertBitmap(ABitmap: TBitmap; const Sizeable: Boolean);
var
OleClientSite: IOleClientSite;
Storage: IStorage;
OleObject: IOleObject;
ReObject: TReObject;
DataObject: IDataObject;
Selection: TCharRange;
FormatEtc: TFormatEtc;
begin
if HandleAllocated and Assigned(FRichEditOle) then
begin
DataObject := TImageDataObject.Create(ABitmap);
FillChar(ReObject, SizeOf(TReObject), 0);
IRichEditOle(FRichEditOle).GetClientSite(OleClientSite);
Storage := nil;
OleObject := nil;
try
CreateStorage(Storage);
FormatEtc.cfFormat := CF_METAFILEPICT;
FormatEtc.ptd := nil;
FormatEtc.dwAspect := DVASPECT_CONTENT;
FormatEtc.lindex := -1;
FormatEtc.tymed := TYMED_MFPICT;
OleCheck(OleCreateStaticFromData(DataObject, IOleObject, OLERENDER_FORMAT,
@FormatEtc, OleClientSite, Storage, OleObject));
OleSetContainedObject(OleObject, True);
try
FillChar(ReObject, SizeOf(TReObject), #0);
with ReObject do
begin
cbStruct := SizeOf(TReObject);
cp := REO_CP_SELECTION;
poleobj := OleObject;
OleObject.GetUserClassID(clsid);
pstg := Storage;
polesite := OleClientSite;
dvAspect := DVASPECT_CONTENT;
if Sizeable then
dwFlags := REO_RESIZABLE;
//OleCheck(OleSetDrawAspect(OleObject,
// Data.dwFlags and PSF_CHECKDISPLAYASICON <> 0,
// Data.hMetaPict, dvAspect));
end;
SendMessage(Handle, EM_EXGETSEL, 0, Longint(@Selection));
Selection.cpMax := Selection.cpMin + 1;
OleCheck(IRichEditOle(FRichEditOle).InsertObject(ReObject));
SendMessage(Handle, EM_EXSETSEL, 0, Longint(@Selection));
IRichEditOle(FRichEditOle).SetDvaspect(
Longint(REO_IOB_SELECTION), ReObject.dvAspect);
finally
ReleaseObject(OleObject);
end;
finally
ReleaseObject(OleClientSite);
ReleaseObject(Storage);
end;
end;
end;
анализируя текст, который надо вставить в RichEdit, вместо нужных фрагментов текста вставляешь картинки найденным выше способом.
Проанализировал, вставил.
А вот дальше проблема. Как отправалять данный текст. Есть 2 варианта:
1. Сохранять все данные rtf вместе с вндрёнными объектами, то бишь рисунками и отправлять. Этот вариант сейчас рабочий.
2. Преобразовывать картинки в текстовое представление и отправлять rtf без объектов (картинок), как это делает ICQ.
Хотелось бы применять 2 вариант. Но опять же повторюсь, проблема в идентификации УЖЕ вставленных смайликов, которые НЕ в виде *LOL* , а ввиде объектов (картинок).
Надеюсь на этот раз я понятно объяснил проблему ;-)
Игорь Шевченко (2005-06-03 21:50:00) [15]Eraser © (03.06.05 18:37) [43]
Можно сделать. Как - очень просто, ищещь способ вставить в RichEdit картинку, находишь его, потом, анализируя текст, который надо вставить в RichEdit, вместо нужных фрагментов текста вставляешь картинки найденным выше способом. Собственно так же, как любой browser видя тэг <img> вставляет вместо него картинку :)
Hint: html-страницы внутрь себя картинку не вставляют, являясь текстом :) В них картинка указывается именем файла. Тебе проще, так как набор смайликов ограничен, то для того, чтобы вставить смайлик, достаточно его кода (например ":)"), по которому ты его однозначно идентифицируешь.
Eraser (2005-06-03 18:37:00) [16]Alexander Panov © (03.06.05 18:30) [42]
а при чем тут ICQ?
ICQ при том, что использует тот же компонент, что и обёртка TJvRichEdit, а именно RichEdit20A, соответственно "как хранятся данные в его редакторе" относится не к коду ICQ, а к коду этого самого RichEdit20A, соответственно, это можно сделать и через TJvRichEdit или напрямую обращаясь к RichEdit20A через дескриптор в TJvRichEdit, весь вопрос "как"...
Alexander Panov (2005-06-03 18:30:00) [17]Eraser © (03.06.05 18:22) [41]
Но ICQ-редактор НЕ написан с нуля см.
а при чем тут ICQ?
Если надо вытаскивать именно из ICQ-клиета, то необходимо разобраться, как хранятся данные в его редакторе в исходном коде.
Eraser (2005-06-03 18:22:00) [18]Alexander Panov © (03.06.05 18:14)
Полностью согласен. Так делается, если писать тестовый редактор с нуля. Но ICQ-редактор НЕ написан с нуля см. [39].
Alexander Panov (2005-06-03 18:18:00) [19]Eraser © (03.06.05 18:14) [38]
А насчёт координат - опять же врядли... в том, то и проблема - идентифицировать рисунок.
Ну вот. Опять снова то же самое.
В любом редакторе, который поддерживает вставку объектов, отличных от текста, необходимо сохранять информацию об этих объектах. Для этого приложение сохздает массив структур, которые связаны каждая со своим объектом.
Как минимум, в этой структуре хранятся:
позиция для отображения на канве(x,y)
размеры либо ссылка на исходный объект.
При любых перерисовках канвы эти сруктуры динамически изменяются для актуализации тех же координат отображения на канве.
Таким образом, приложение в любой момент времени знает, что находится в любой точке канвы, и всегда находит связанную с этой точкой структуру.
Eraser (2005-06-03 18:16:00) [20]Alexander Panov © (03.06.05 18:14) [37]
Класс окна ввода в ICQ 5 - RichEdit20A....