Форум программистов CodeGuru
23 Апрель 2018, 21:37:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Решить задачу с RichEdit2.0  (Прочитано 17294 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PupaJr
Пользователь
***
Офлайн Офлайн

Сообщений: 33


Просмотр профиля
« : 09 Ноябрь 2006, 18:50:01 »

Такая задача:
а) пользователь набирает текст в RichEdit2, выделяет его и оформляет цветом, подчёркиванием, кусочек текста там, там, какой-то кусочек текста курсивом и т.д
(под окном ввода текстакнопочки - как в ворде I U B T C .... нажимая на которые получаем введённый текст с этими атребутами)
б) потом этот оформленный текст сохраняется в текстовой переменной типа char, хранится некоторое время и потом выдаётся в другой RichEdit2 в другом окне приложения или вообще в другом приложении, с СОХРАНЁННЫМ оформлением.

настройки цвета и типа шрифта конвертирубтся допустим так:
жирным быделен текс ставим ключ: /b, закончилась часть жирного /B
цвет: /RGB, отключение /rgb
курсив: /It, отключение /it
и так далее тип шрифта, зачеркнутость и подчёркивание, размер....

Почему все настройки шрифта в текст, потому что уже существует интерфейс обмена между окнами и его менять - в 100раз больше работы и вообще куча программ зацепится, которых изменить нет возможности.

Как пробывал:
Всё на API через sendmessage
Использовал CHARFORMAT2, ставил атрибуты, но при этом другие теряются, если уже был цвет, то я ставлю следующее слово другим цветом или например жирным делаю, то и тот тоже становится новым атрибутом а свой теряет, хотя посылаю сообщение _seletcion (не помню точно как пишется, типо работать с выделенным текстом только), перед этим посылаю сообщение начала и конца выделенного текста. Ну я думаю здесь просто надо точно последовательность сделать и читать атребуты и на них ставить, а у меня видимо получается что я как-бы новые ставлю....
А вот как эти атребуты потом вытащить и перевести в текстовые ключи а потом опять в атребуты в другом окне - тут я сел... ПОМОГИТЕ!!! Спасибо.
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 10 Ноябрь 2006, 07:58:44 »

Я так понимаю, у Вас свой формат для передаваемого текста ?
Если да, то можно попробовать просто нужный фрагмент из RichEdit - а сохранять в своем приложении в буфер как RTF, передавать другому приложению и там в нужное место загружать.
Имхо, так гораздо проще. RTF - тоже просто текст с разметкой.
Записан

PupaJr
Пользователь
***
Офлайн Офлайн

Сообщений: 33


Просмотр профиля
« Ответ #2 : 14 Ноябрь 2006, 16:46:21 »

Дело в том, что на API весь проект и если я начинаю использовать MFC то прога раздувается сильно в размере (ехе) и начинает требовать разные библиотеки, у меня то проект работает, а вот при переносе его на тругой комп то там раз за разом всплывают потребности в dll_ках, а таскать за файлом своим десято dll от VC типа MSVC71, размером около 1М при этом проект сам 300к - ну как-то нелогично..

У меня больше проблема вызывает работа со строками и CHARFORMAT2 - как ключи типа /b /u  и тд, выловить в строке и поставить соотв. атрибут в RICHEDIT2.0 с точки установки этого ключа в тексте... и наоборот, найти изменение атрибута в тексте и преобразовать его в соотв. текстовый ключ.
Думаю всё решиться в цикле While ...  и доступ через указатели к строке, тут никаких MFC ненадо. Но я несилён в строках с указателями и с CHARFORMAT2 (я вообще начинающий :-) ).
Длина текста небольшая, порядка 256 символов, так что цикл будет небольшой по времени. Ведь атребуты могут идти подряд и в перемешку, вот именно это и эти возможние комбинации меня путают в создании алгоритма цикла. Сделать на 1 атрибут нет проблем, 1 цикл и я найду в строке подстроку "/b", и могу поставить "жирность", но вот с кучей атрибутов как быть....

Дело в том, что я немогу использовать RTF - текс передаётся как переменная CHAR - строка в которой есть ключи настройки текста - вот такой пример:

"Проверка связи машин /B/RGB123456USC1/* закончена с /B/Uошибкой"

здесь основной текст простой по форматированию - по умолчанию а текст "USC1" должен отобразиться жирным и с цветом 123456, потом простой текст, и "ошибкой" должен быть жирный и подчёркнутый, и эти ключи естественно не должны быть видны в окне получателя. Типо этого:

Проверка связи машин USC1[/color] закончена с ошибкой
« Последнее редактирование: 14 Ноябрь 2006, 16:55:01 от pupajr » Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 17 Ноябрь 2006, 07:42:43 »

Цитировать
Длина текста небольшая, порядка 256 символов, так что цикл будет небольшой по времени. Ведь атребуты могут идти подряд и в перемешку, вот именно это и эти возможние комбинации меня путают в создании алгоритма цикла. Сделать на 1 атрибут нет проблем, 1 цикл и я найду в строке подстроку "/b", и могу поставить "жирность", но вот с кучей атрибутов как быть....

Ну, это обычно реализуется как набор флагов (например, битовых).
Для простоты, допустим, под каждый флаг выделяется одна переменная.
Ну и дальше все просто. Изначально флаги инициализируются значением false.
Дальше идет цикл разбора текста. Например, встречается последовательность . Смотрим, установлен ли в программе соответствующий флаг (значение равно true) если да, то инвертируем его и, соответственно, на этом месте в ричедите должен заканчиваться жирный текст.
Получается, что для каждого атрибута надо запоминать еще и соответствующую позицию начала этого атрибута в тексте. То есть, встречается , например, запоминаем номер символа, на котором она встретилась. Встретилась еше раз \B - смотрим, если позиция установлена (она, например, одновременно и флагом являться будет) - то выделяем в RICHEDIT текст с этой до текущей позиции и через CHARFORMAT2 устанавливаем жирный шрифт.
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!