среда, 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 на этот раз…

Комментариев нет:

Отправить комментарий