Я использую CRichEditCtrl для редактирования языка компьютера, и при каждом его изменении я вызываю SetSelectionCharFormat для текущей строки текста (как сообщает LineFromChar (-1)), чтобы выделить синтаксис. (Например, комментарии зеленого цвета, заголовки разделов крупным шрифтом, ошибки компиляции красным цветом и т. Д.) Обратите внимание, что этот язык не имеет многострочных функций, таких как комментарий C, где ввод / * в одной строке делает следующие строки частью комментарий тоже; для любого данного изменения символа мне нужно только изменить цвет текущей строки.
Похоже, все работает нормально.
Однако есть некоторые странные проблемы. Один из них — когда несколько строк текста выбираются из другого места и вставляются. Мой OnUpdate () вызывается, но наивно полагает, что единственная строка, которая может нуждаться в переформатировании, — это строка, возвращенная LineFromChar (). Этого достаточно, когда пользователь печатает символ за символом, но это означает, что после получения многострочной вставки программа переформатирует только последнюю строку вставленного текста. Как он может знать, где Начните вставка была?
OnUpdate вызывается внутри операции вставки.
Должна быть возможность создать подкласс управления RTF и перехватить сообщение WM_PASTE. Если WM_PASTE не используется внутри, возможно, будет возможно использовать EM_PASTESPECIAL. Если даже это сообщение не отправлено, вы должны принять комбинацию клавиш Ctrl + V, которая вызывает операцию вставки.
Чем вы можете определить начальную позицию операции вставки.
Spy ++ может быть полезен для определения потока сообщений в элементе управления RTF.
Других решений пока нет …