TOM используется во многих приложениях Windows, а также в компоненте VCL TRichEdit. TOM хорошо подходит для изменения параметров шрифта отдельных частей текста. ТОМ хорошо подходит для подсветки синтаксиса и выделения орфографии. Так же как MSHTML - это COM интерфейс. В рунете крайне мало информации по этой теме. В MSDN - нет нормальных примеров использования
#include
//…
GETTEXTLENGTHEX tl = { GTL_NUMCHARS, 1200};
int iLen = SendMessage(Memo1->Handle, EM_GETTEXTLENGTHEX, (WPARAM)&tl, 0);
//Memo1 - это элемент класса TRichEdit - Мемо -это для краткости
HWND hwnd = Memo1->Handle;//Получаем хендл, чтобы потом слать сообщения
ITextDocument *pDoc;
ITextRange *pRange;
IUnknown *pUnk = NULL;
SendMessage(hwnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pUnk);
//Здесь мы получаем ссылку на ОЛЕ интерфейс Мемо1
if(pUnk &&
pUnk->QueryInterface(__uuidof(ITextDocument),(void **) &pDoc) == NOERROR)
{
//стандартный метод преобразования интерфейсов
pDoc->Range(0,iLen,& pRange);
//получаем ссылку на кусок текста
ITextFont * iFont;
pRange->SetRange(0, iLen);
//это мы на всякий случай еще раз указываем длину.
pRange->GetFont(& iFont);
// получам ссылку на шрифт
iFont->SetForeColor(clBlack);
//теперь весь текст черный
//если вместо clblack будет Memo1->DefAttributes->Color); - то это не даст эффекта во многих случаях.Чтобы этого избежать используйте следующий код
/*TColor tc=Memo1->DefAttributes->Color;
if (tc==clNone||tc<0)
tc=clBlack;*/
//теперь можно
pRange->SetRange(iLen/2, iLen);//выбираем половину текста - в отличие от selstart sellengh - выделение не отображается и все работает быстрее. Также важно отметить, что мы указывает первый и последний символ, а не первый и длину
//это мы на всякий случай еще раз указываем длину.
pRange->GetFont(& iFont);
// получам ссылку на шрифт
iFont->SetForeColor(clRed);
//закрашиваем красным
}
Для быстродействия один раз в главной функции подсветки диспатчите интерфейс, получите ренж и передавайте его во все функции. Например,
inline void __fastcall ColorIT(ITextRange *pRange,long Start, long End, TColor Color)
{
ITextFont * iFont;
pRange->SetRange(Start, End);
pRange->GetFont(& iFont);
iFont->SetForeColor(Color);
}
Остальное можно узнать отсюда
http://msdn.microsoft.com/en-us/library/bb787607(VS.85).aspx