Расширенное управление редактированием: предотвращает расширенное форматирование?

#winapi #richedit #text-formatting

#winapi #richedit #форматирование текста

Вопрос:

Как запретить пользователю изменять что-либо, кроме текста, в элементе управления Rich Edit, используемом в Win32?

(т. Е. они не должны иметь возможности изменять форматирование любого текста, добавлять графику и т.д.; если они копируют-вставляют новый текст, следует сохранить только текст, а связанное форматирование следует отбросить.)

Ответ №1:

Я никогда не находил особенно элегантного способа справиться с этим: то, что я делал в прошлом, это:

1) Перехватите сообщения WM_KEYDOWN для элемента управления и удалите все клавиши форматирования (Ctrl E, J, R, L, 1, 2, 5, и Ctrl Shift A, 7)

2) Перехватите все операции вставки, перехватывая сообщения WM_COMMAND с идентификатором ID_EDIT_PASTE, и замените сообщение о вставке сообщением EM_PASTESPECIAL,CF_UNICODETEXT к элементу управления. (Это с MFC: в зависимости от того, какую платформу или язык вы используете, для этого может потребоваться перехватывать Ctrl V и подобные, а не ID_EDIT_PASTE .)

Признаю, не очень красиво, но, похоже, работает.

Ответ №2:

Этот ответ, вероятно, немного запоздал, но для тех, кто еще ищет ответ на эти вопросы, лучший способ, который я нашел, получить полный контроль над операциями вставки в расширенном управлении редактированием — это предоставить реализацию IRichEditOleCallback::QueryAcceptData , а затем вернуть S_FALSE, чтобы остановить их все вместе или отфильтровать определенные форматы clip board, изменив параметр lpcfFormat.

Функция CRichEditView::QueryAcceptData в MFC предоставляет отличный пример того, как это можно сделать. Это будет работать для всех видов операций вставки, включая перетаскивание, так что это лучший способ получить полный контроль над тем, что происходит.

Ответ №3:

Даже позже 🙂

 SendMessage(wndEdit, EM_SETEDITSTYLE, SES_EMULATESYSEDIT, SES_EMULATESYSEDIT)
  

кажется, это помогает: вставка вставляет обычный текст, а горячие клавиши форматирования отключены.

SES_EMULATESYSEDIT: Когда этот бит включен, расширенное редактирование пытается эмулировать системный элемент управления редактированием (по умолчанию: 0).

Вы по-прежнему сохраняете некоторые «бонусные» функции richedit, такие как полосы прокрутки по запросу.

Примечание: Хотя это предотвратит вставку текста в расширенном формате в элемент управления RichEdit, это также не позволит вам программно форматировать текст; все расширенное форматирование отключено.