Показаны сообщения с ярлыком RichEdit. Показать все сообщения
Показаны сообщения с ярлыком RichEdit. Показать все сообщения

среда, 3 марта 2010 г.

7-ой RichEdit

Как-то рассказывал про розыск новейших версий RichEdit, которые в частности есть и в составе Microsoft Office. В частности тогда брался за жо… разыскивался RichEdit версии 6.0. А 6-ой RichEdit выгодно отличался от версии 4.1 тем, что не только умеет отображать сложные таблицы, но и хоть с переменным успехом, но и редактировать их. По крайней мере вполне сносно манипулирует отдельными столбцами.

В MSDN есть неплохая обзорная статья по разным версиям RichEdit и их отличиям. Правда, уж к слову говоря, Мюррей так тогда и не рассказал про возможности 7-ой версии RichEdit, но вот по неофициальной информации Microsoft все-таки спалилась, что новый RichEdit будет доступен в составе MS Office 2010. А я тут аккурат на днях и скачал его бета-версию. Ну, и конечно же, кинулся выискивать новый RichEdit.

С версиями как всегда неясно всё да туманно. Но два характерных “палева” все-таки на глаза попалось. Хоть и в новом офисе компонент по прежнему называется RichEdit 6.0, но версия самого файла все-таки новая. В 2010-ом офисе она уже 14-ая, а в 2007-ом была 12-ая.Версия RichEdit и версия DLL-файла - найди два отличия

 

 

 

 

 

И второй момент: в riched20.DLL, найденной в папке нового офиса набор экспортируемых функций значительно изменился.

Экспортируемые функции в новой версии RichEdit

Новый RichEdit в жизнь – “за работу, товарищи, за работу” ©. Правда, документацией по RichEdit Microsoft не очень-то озабочена. Найти инфу можно только в вышеупомянутом блоге Мюррея, да и то там она далеко не полная. Но все-же будем надеяться на существенные изменения.

Немного ссылок: на CodeProject.com появилась неплохая статья про использование новейших версий RichEdit  даже в такой старушке как Visual С++ 6.0. В принципе все написано толково – действительно все сводится к манипуляции с именем класса окна. Хотя и в этой статье опущены некоторые моменты: как менять используемую версию RichEdit на лету, непосредственно в коде создания окна да возможные траблы с загрузкой нужных версий DLL. Но в общем и целом, все расписано достаточно грамотно. Одобрям-с, хотя и не ново.

Информации о возможности распространения той или иной версии RichEdit в составе собственных продуктов как не было, так и нет. Помалкивают об этом мелкомягкие, упорно помалкивают. А это очень и очень жаль. Ну на “нет” и суда нет :).

PS: наваять что-ли парочку-троечку статей по использованию RichEdit!?! Все-таки на RSDN.ru эти вопросы поднимаются регулярно…

среда, 2 сентября 2009 г.

Гиперссылки в RichEdit

Наконец-то Microsoft официально “раскололась” об особенностях автоматической подсветки гиперссылок в RichEdit. И-э-эх, этот бы код “да богу в уши” да пару-тройку лет назад бы…

Если внимательно почитать статью, легко убедиться, что все навороты вроде подсветки адресов email без префикса mailto, тултипы к гиперссылкам поддерживаются версией RichEdit 5.0 или выше. Коего даже в Windows XP SP3 днем с огнем не сыщешь. Всё это, конечно, очень здорово. Но есть некоторые “но”. Например, когда RichEdit четвертой версии “светит” ссылки сам – автоматически, то он где ни попадя распихивает угловые скобки. Приятный такой сюрприз, которого во всех предыдущих версиях не было. Так что, если используется механизм собственных гиперссылок с использованием угловых скобок – весь ваш код поплывет напрочь.

Но это еще полбеды. По ходу автоматической подсветки RichEdit без конца генерит нотификацию EN_CHANGE – изменение текста (если установлена маска ENM_CHANGE). Тоже особенность с последствиями. Кладете текст в RichEdit, просите подсветить ссылочки и у-у-у-упс, весь текст вдруг преображается, и тут же помечается как имеющий несохраненные изменения.

Ох, и накушался я отладки пару-тройку лет назад, пока разбирался с этими незначительными “тонкостями” RichEdit 4.x. Представьте какая красота: открыл документ, посмотрел на текст, закрываю – а он просит сохранить изменения!?! Ух и немало было ночей потрачено на выяснение “какая сволочь стреляла”.

В конце концов, положил я с прибором на автоматическую подсветку и написал собственный алгоритм парсинга гиперссылок, безо всякой мути вроде изменения текста и словно по волшебству появляющихся везде подряд угловых скобок. Ну, а уж свой тултип прикрутить к этим гиперссылкам задачка совсем уж несложная. Хотя стоит отметить, что теперешние microsoft`овские тултипы всплывают даже и на моих “ручных” гиперссылках :).

Тултипы поддерживаются в RichEdit 5.0 и старше, и включаются так:

//добавим определения, если их нет в старых header`ах
#ifndef SES_HYPERLINKTOOLTIPS

   enum {SES_HYPERLINKTOOLTIPS=8};
#endif
#ifndef EM_SETEDITSTYLE

   enum {EM_SETEDITSTYLE=(WM_USER + 204)};
#endif
SendMessage(hwndRichEdit,EM_SETEDITSTYLE,
    SES_HYPERLINKTOOLTIPS,SES_HYPERLINKTOOLTIPS);

Что ж, посмотрим, что Microsoft преподнесет в аспекте совместимости RichEdit на этот раз…

суббота, 14 марта 2009 г.

Как таблицы в текст пихались

В ОС Windows в RichEdit-контроле - который отвечает за форматированный текст RTF - поддержка таблиц реализована… да никак она, собственно, и не реализована. И девелоперском кругу бытует мнение, “что великий чешский писатель Карел Чапек был карелом”… тьфу ты… что поделать с таким “отсутствием” таблиц ничего нельзя. Однако на самом деле, чем старше версия RichEdit, тем больше возможностей работы с таблицами. Правда, иногда до них не так-то просто добраться, но все же они есть. “Ты видишь суслика? Нет… Но суслик есть!” © – как именно добраться – разговор отдельный.

А за прошедшие зимние месяцы распространился было слушок, что новейшая версия RichEdit 6.0 (RE) не только умеет создавать и показывать таблицы – экая невидаль, это давным-давно “взятая высота”! Но и изменять размеры ячеек. Ну, а такой функционал меняет дело. Одно дело генерировать таблицы да любоваться на них, совсем другое предоставить пользователю возможность и самому порезвиться. А раз есть разница для пользователя, то скорее всего должна быть разница и для нашего кармана.

Оказывается эта версия RE есть в составе Microsoft Office 2007 (и не только). Не долго размышляя, скачал 2007-ой офис, поставил, с тоской посмотрел на него… и незамедлительно выпил © снёс.

Офис то снесен, но вот файлы системные от него остались. А вот именно они-то мне и нужны. Иду в папку %COMMON_FILES%\Microsoft Shared\OFFICE12 и с любопытством копаюсь в ее содержимом. Все привычно, серая скука и до боли знакомые файлы. Но посредь папки гордо красуется файл RichEd20.DLL, который вообще говоря, есть почти в любой даже Win98\2K, не то что в XP. Ага, думаю, очередная заглушка для совместимости… Но нафига же новейшему офису совместимость с древним RE 2.x-3.x – уж эти “заглушечные” DLL есть вообще практически в любой XP. Да и офис немаленький, на кой ему таскать заглушки, если он сам ими и вовсе не пользуется…

В общем, есть над чем призадуматься. Сигаретку, еще кофейчинского (ну какой девелопер без кофейчиского!?!) и начинаем, неспеша, эдакой “археологической метелкой” сметать пыль с нижних пластов “офисных” недр – ковыряться в подробностях.

Смотрите, экая штука! А размер-то RichEd20.DLL – аж почти цельный метр мегабайт – многова-а-ато - это уже вообще на заглушку никак не тянет.  И… о-п-п-па, смотрим в детали и вот оно: описание – “Microsoft RichEdit 6.0”, да и номер версии файла аж 12.xxx. Вообще в RichEd20.DLL содержится реализация RichEdit версии 3.0. Но размер самой DLL в версии 3.0 значительно меньше – что-то около 400 килобайт. И уж точно major-номер версии ну никак не 12 (имеется ввиду версия файла, если RichEdit 6.0 это версия продукта вообще, то версия файла несколько иное. Вы можете всё это увидеть в свойствах файла).

Ну, точно судя по всему это и есть новая версия. Долго сказки блоги сказываются, да быстро код пишется. Фтоппку все эти дот.нет`ы. Стартую старинную подружку 6-ую студию, генерю визардом простейшее MFC-приложение на основе СRichEditView и начинаю колдовать над “визардовым” кодом.

Элементарно, Ватсон! Ручками загружаем в адресное простраство необходимую DLL. На этапе создания вида CRichEditView подменяем имя класса окна… Компилируемся, с предыханием запускаем… И у-у-упс! Все сработало!  Рихтеровским Spy`ем проверяем класс окна. Отлично! Это RichEdit60W – приложение создало именно то, что просили. Затаив дыхание, открываем любой rtf-файл c таблицей… Подтаскиваем мыша к границе таблицы… Курсор меняется на стрелку! Нажали левую кнопку и перетаскиваем границы ячеек. Вуаля!

Получили приложение с поддержкой таблиц в тексте ака в не самой старой Висте. Но созданное аж в древнем Visual C++ 6, причем безо всяких там VS2008, WPF, SilverLight и иже с ними. Не так страшен черт, как его малюют, если только чуть-чуть спуститься с заоблачных высот абстракций к старому доброму WinAPI. Ну не люблю я, хоть режьте меня, все эти похотливые до вычислительных ресурсов модные новинки: постоянно пытающиеся подкачать очередной Дот.Нет в десяток метров, требущие пары гигов памяти, очередных service pack`ов…  А если можно несколькими простыми штрихами создать приложение, весящее первые сотни килобайт,  то зачем, пожалуйста скажите мне, за-а-ачем платить больше?