перемещение каретки (RichEdit, TOM)
От: romanian Украина  
Дата: 20.10.06 09:19
Оценка: 3 (1)
был вопрос по использованию TOM
добрый человек AlexZu ( ) помог

Вы не указали платформу пазработки (.NET, WinAPI, some else), поэтому буду указывать несколько вариантов:

1) Для получения уведомления об изменении текста в richedit'е (RichTextBox) используйте соотв. событие (TextChanged, EN_CHANGE).
2) для получения позиции каретки можно использовать или RichTextBox.SelectionStart, или ITextSelection.Start.
3) После получения позиции каретки можно получить слово, в которое каретка попадает: для этого необходимо получить ITextRange, у которого Start и End = позиции каретки, затем у полученного ITextRange вызвать метод Expand с параметром tomWord.
4) для подсветки слова (либо иных модификаций атрибутов текста) исп-те у полученного ITextRange св-во Font (ITextFont).
5) о морганиях при работе с TOM имеет смысл беспокоится только при массовой модификации атрибутов (цвет, шрифт) текста, для подавления отрисовки у ITextDocument есть методы Freeze\Unfreeze.
5) для поиска примеров поищите в форумах RSDN (напр. в .NET GUI, COM, WinAPI) по словам TOM, ITextRange, ITextDocument, также можете посмотреть использование TOM'а в исходниках Wordpad (искать в MSDN).
6) также вам необходимо озаботиться об изменении текста с пом. drag'n'drop, в этом случае могут изменится 2 участка текста...
7) лучше все обсуждения вести в форуме RSDN, и вопросы задавать более конкретно


согласно пункту 7 следующий вопрос хочу спросить на форуме

платформа WinApi
в общем пользуя мсдн всё получилось
спасибо за пункт 2) — сам бы не додумался.. (может ещё есть какой то хитрый способ получить Range в который бы входило только слово на котором стоит каретка?)
вопрос по ходу возник такой, при использовании TOM у меня возникают проблемы с перемещением каретки — я ввожу текст, а каретка перезжает не вперёд как обчно, а назад (или же стоит на месте, а текст уезжзает вперёд), это можно как то исправить? может я чтото делаю не так..
вот приблизительно код
ITextDocument *pDoc;
ITextRange *pRange;
IUnknown *pUnk = NULL;
ITextFont *pFontSel = NULL;

SendMessage(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pUnk);
if(pUnk &&
pUnk->lpVtbl->QueryInterface(pUnk, &IID_ITextDocument, &pDoc) == NOERROR)
{
int i=0;
pDoc->lpVtbl->Freeze(pDoc, &i);
pDoc->lpVtbl->Range(pDoc, 0, 4, &pRange);
pRange->lpVtbl->GetFont(pRange, &pFontSel);
if(!pFontSel)
pout("error");

pFontSel->lpVtbl->SetBold(pFontSel, tomTrue);
pFontSel->lpVtbl->Release(pFontSel);
pRange->lpVtbl->ChangeCase(pRange, tomUpperCase);
pDoc->lpVtbl->Unfreeze(pDoc, &i);
pDoc->lpVtbl->Release(pDoc);
pUnk->lpVtbl->Release(pUnk);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.