В блоге 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).