Как очистить «временное» (tomApplyTmp) форматирование из RichEdit? - PullRequest
2 голосов
/ 27 марта 2019

В блоге 2015 года RichEdit Colors ? , разработчик Microsoft Мюррей Сарджент отметил, что RichEdit controlsupports «временное» форматирование;используется программами проверки орфографии и редакторами IME:

Форматирование температуры

В IME и средствах проверки правописания любят использовать форматирование символов, например волнистые подчеркивания и специальные цвета, для обозначения специальной обработки текста, например, , орфографическая ошибка.Чтобы избежать изменения основного форматирования символов, RichEdit предоставляет временное форматирование типа и цвета подчеркивания, а также цветов переднего плана и фона. Когда такое форматирование удаляется, исходное форматирование снова используется для отображения. Временное форматирование не сохраняется в форматах файлов и не может быть прочитано клиентом, только применяется.

Чтобы определить временные свойства форматирования, позвоните ITextFont::Reset(tomApplyTmp) или ITextFont::Reset(tomApplyIMETmp) для проверки или IME соответственно.Затем укажите временные цвета форматирования, вызвав ITextFont::SetForeColor() и ITextFont::SetBackColor() по желанию.Укажите цвет и тип временного подчеркивания, позвонив по номеру ITextFont::SetUnderline(value).В частности, если значение = tomAutoColor, используется автоцвет (цвет текста по умолчанию).Если (0xFF000000 & value) = 0xFF000000, временный цвет подчеркивания установлен на 0x00FFFFFF & value.Иначе, если значение является допустимым типом подчеркивания, временный тип подчеркивания устанавливается в значение.Чтобы применить определенное временное форматирование, наберите ITextFont->Reset(tomApplyNow).Если свойство временного форматирования не определено, используется соответствующее исходное свойство.

emphasis mine

Как вы на самом деле удаляете "временное " форматирование?

Чтобы применить временное форматирование к блоку текста:

ITextRange range = textDocument.Range(0, 5); //startIndex, endIndex
ITextFont font = range.Font();
font.Reset(tomApplyTmp);
font.Underline = tomWave;    //red wavy underline
font.Underline = 0xFF0000FF; //and make the wavy underline red
font.Reset(tomApplyNow);

В 2012 он отметил ? , что RichEdit поддерживал эти вещи - текстовую объектную модель - в течение многих лет (то есть, она была представлена ​​в Windows XP SP1):

RichEdit Проверка орфографии, автокоррекция и прогнозирование

RichEdit предоставляет поддержку проверки орфографии клиента ( объектная модель TOM и временное форматирование символов - см. tomApplyTmp ) и автозамена (см. EM_SETAUTOCORRECTPROC ) в течение многих лет,Но клиент RichEdit несет ответственность за доступ к компонентам проверки орфографии и автокоррекции, за исключением встроенной опции автозамены математики.Для таких клиентов, как OneNote и Outlook, такая ответственность - небольшая часть приложения.Но для небольших программ доступ к проверяющим компонентам может быть трудным.Это было бы особенно верно для небольших приложений, написанных с использованием Windows RT .

. Я могу понять, как применять временное форматирование к текстовому блоку:

//Get ITextDocument interface for the RichEdit control    
IRichEditOle ole;
SendMessage(RichEdit.Handle, EM_GETOLEINTERFACE, 0, out ole);
ITextDocument doc = ole as ITextDocument;


ITextRange range = doc.Range(spellingError.StartIndex, spellingError.EndIndex);
ITextFont font = range.Font();
font.Reset(tomApplyTmp);
font.Underline = tomWave;
font.Underline = 0xFF0000FF; //and make the wavy underline red
font.Reset(tomApplyNow);

Но я не могу понять, как очистить все существующие временные форматы.

Я пытался «выбрать все и ничего не применять» :

ITextRange range = doc.Range(0, TextLength); //start index, end index
ITextFont font = range.Font();
font.Reset(tomApplyTmp);
font.Underline = tomNone;
font.Reset(tomApplyNow);

Но это только оставило существующее временное форматирование таким, каким оно было.

Примечание: В 2015 году Реми Лебо ? ( @ RemyLebeau ) отметил, что объектная модель Text Services требует MsftEdit.dll (т. Е. Microsoft Edit v4.1)

Bonus Chatter

Rich Edit был представлен в Windows 95 и первоначально имел имя класса Windows:

RICHEDIT_CLASS = "RichEdit"

С годами он был улучшен, но получил новые имена классов, сидя в новых библиотеках, для поддержки в обратном направлении.совместимость.

В Windows XP SP1 появился новый класс «Microsoft Edit», расположенный в «MsftEdit.dll»

Version       Dll           Class name const  Class name string             OS
============  ============  ================  ============================  ===========
RichEdit 1.0  Riched32.dll  RICHEDIT_CLASS    "RICHEDIT"                    Windows 95
RichEdit 2.0  Riched20.dll  RICHEDIT_CLASS    "RichEdit20A", "RichEdit20W"  Windows 98
RichEdit 3.0  Riched20.dll  RICHEDIT_CLASS    "RichEdit20A", "RichEdit20W"  Windows 2000   (with RichEdit 1.0 emulator
RichEdit 4.1  Msftedit.dll  MSFTEDIT_CLASS    "RICHEDIT50W"                 Windows XP SP1 (with RichEdit 1.0 emulator)
RichEdit 7.5  MsftEdit.dll  MSFTEDIT_CLASS    "RICHEDIT50W"                 Windows 8
RichEdit 8.5  MsftEdit.dll  MSFTEDIT_CLASS    "RICHEDIT50W"                 Windows 10

И поэтому «Microsoft Edit» - это то, что вы должны использовать(и необходимо использовать для текстовых служб), а не «Rich Edit».

Microsoft Edit обновляется с более новыми версиями ОС:

Windowx XP:    File description: Rich Text Edit Control, v4.1
Windows Vista: File description: Rich Text Edit Control, v4.1
Windows 7:     File description: Rich Text Edit Control, v4.1
Windows 8:     File description: Rich Text Edit Control, v7.5
Windows 10:    File description: Rich Text Edit Control, v8.5

с Windows8, элемент управления Microsoft Edit получил возможность автоматически иметь поддержку проверки орфографии (поскольку Windows 8 добавила SpellCheck API).

1 Ответ

1 голос
/ 09 мая 2019

Странно.Я делаю нечто подобное (спасибо вашему посту, потому что связную документацию для этого крайне трудно найти), и у меня нет проблем со сбросом временных стилей так же, как вы пишете, с той лишь разницей, чтоЯ использую C ++:

doc->Range(5, 15, &range);
range->GetFont(&font);
font->Reset(tomApplyTmp);
font->SetUnderline(tomNone);
font->Reset(tomApplyNow);
...