Я пытаюсь реализовать опцию в richTextBox для отображения графических смайликов вместо текстового представления. Поэтому я в основном ищу возможность заменить, например, строку ':)' соответствующей картинкой.
Я много гуглил, и единственное простое/рабочее решение, которое я нашел, было:
Clipboard.SetImage( Properties.Resources.angry );
richTextBox1.Paste();
Но у этого подхода есть большой недостаток - он перезаписывает содержимое буфера обмена, поэтому может мешать пользователю.
Может ли кто-нибудь посоветовать, как это сделать по-другому (без использования буфера обмена)?
Я также думал о сохранении и восстановлении содержимого буфера обмена после операции - но и для этого я не нашел простого способа...
Любая помощь/советы будут высоко оценены!
РЕДАКТИРОВАТЬ
На самом деле резервное копирование / восстановление буфера обмена было плохой идеей. Замечено, что когда-то ОС / AV распознает «опасную» операцию, что приводит к сбою приложения.
Все еще ищу другой путь / лучший компонент RTB (бесплатный) ...
РЕДАКТИРОВАТЬ-2
Я нашел рабочее решение здесь: Вставить изображение в позицию курсора в поле форматированного текста
Но все же не на 100% доволен, потому что качество изображения теряется
Вы можете сохранить объект данных, который уже находится в буфере обмена, настроить его, а затем вернуть объект данных туда, где вы его нашли. См.: Буфер обмена.GetDataObject() и Буфер обмена.SetDataObject(). Имейте в виду, что при использовании метода .Paste()
элемента управления RTB вы потеряете прозрачность растрового изображения (если она есть, конечно).
Я знаю эти методы, но они мне не подходят Что я вижу у других людей похожие проблемы stackoverflow.com/questions/2578900/…stackoverflow.com/questions/1374584/…stackoverflow.com/questions/6262454/…
Да, вы можете это сделать. В целом, это хорошая идея? Нет. У вас есть другие варианты? да. Кажется, я уже говорил вам в предыдущем комментарии, что RTB поддерживает формат WMF/EMF. Вы могу встраиваете растровое изображение в WMF. Это то, что вы должны сделать. Если вместо этого вы решите использовать буфер обмена, сделайте это правильно, и он тоже будет работать (хотя может быть больше, чем один крайний случай, с которым вам нужно иметь дело. Ну, как всегда). Вы можете протестировать процедуру вставки растрового изображения в RTB и проверки RTF. Это все есть.
Спасибо, Джими. Не могли бы вы поделиться фрагментом кода? Я могу преобразовать свой PNG в WMF, но до сих пор не знаю, как вставить WMF/WMF с BMP в .. :( Согласитесь, манипулирование пользовательским буфером обмена - не лучший выбор... Но я не могу найти другого способа в данный момент...
Я пропустил ваш комментарий. С чем вам помочь? Способ вставки в существующий текст раздела RTF, определяющего метафайл, или определения положения вставки? Обе? Что-то другое?
Оба на самом деле ... (если вы можете быть так любезны)
В вашем «Редактировании 2»: «потеря качества», которую вы получаете, если это то, о чем сообщили другие люди, - это просто потеря информации о прозрачности. Чтобы обойти это, специально нарисуйте изображение на сплошном фоне в цветовом режиме 32bpp, а затем нарисуйте результат в расширенном метафайле.
После нескольких часов гугления и тестирования, кажется, я наконец нашел способ избежать копирования/вставки.
Ниже ссылки, спасибо, я нашел свои ответы:
https://www.codeproject.com/Articles/30902/RichText-Builder-StringBuilder-for-RTF
https://github.com/axuno/SmartFormat/tree/master/src/SmartFormat.Demo/ThirdParty/RTFLib
Через событие TextChanged RichTextBox