Как узнать регион, занимаемый текстом?

Тема в разделе "WASM.WIN32", создана пользователем Dark Silence, 17 фев 2006.

  1. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia
    Функция DrawText помогает вычислить прямоугольник занимаемый текстом, но если текст многострочный, то обычно длины строк разные. Мне необходимо знать длину каждой строки в пикселах, а ещё лучше HRGN обрамляющий текст (или массив крайних точек, что тоже самое впринципе

    ).



    Резать самому текст на строки, очень долго и нудно. Может быть кто-нибудь слышал/видел/знает подобный алгоритм???



    Практическое применение всему этому делу: реализация гиперссылок на компоненте собственной разработки.



    Заранее благодарен.
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Функция GetTextExtentPoint32 не дает правильного результата?

    Получить регион наверное можно используя функции BeginPath, EndPath и SelectClipPath.
     
  3. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"


    Если даже такую элементарную вещь сделать влом, то лучше забей, все равно ничего не получится.
     
  4. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia




    Мне нужен регион не самого текста, а регион текста по контуру строк. Ну для примера, как в браузере ссылка из 2-х трок выглядит. Я могу навести между букв, а считается что я на ссылку навёл. Вот в этом роде.
     
  5. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia




    ) Ты видел исходники функции DrawTextEx в Windows 2000 Sp 3. Я бы не сказал что ЭТО просто. Я бы мог её выдрать и адаптировать под себя, но мне интересно может быть кто-нибудь уже реализовывал подобное? Может я элементарщины не вижу какой в API?
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Dark Silence

    В чем же проблема? Функция дает посути измерения прямоугольника, в котором существует текст, и тебе остается только проверить попадает ли в него некоторая точка.
     
  7. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia


    В том-то и дело что прямоугольника. Вот пример:



    http://www.wasm.ru/forum/index.php?action=vthread&forum=4&

    topic=13455





    Если я буду водить мышкой справа от надписи "topic=13455" то я тоже буду попадать в прямоугольник, но в этом месте текст уже закончился.



    Я вижу пока только один путь: адаптировать под свои нужды DrawTextEx, т.к. он учитывает множество особенностей различных кодировок и т.п. т.к. рубить текст самому на строки не есть хорошо.
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Dark Silence







    while(std::stringstream::getline())



    Хмм.... :)
     
  9. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia




    Эх ... совсем я глупый стал, главного-то и не сказал ...



    DrawText сам рубит текст на линии, т.е. я даю ему одну линию текста например: "http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=13455" и указываю для вывода прямоугольник шириной 30 пикселей, на выходе будет:



    ht

    tp

    :/

    /w

    ........... ну и так далее ... вот в чём основная проблема!!! Т.е. мне нужно порезать текст на линии точно также как это делает DrawText либо написать аналогичную функцию.
     
  10. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Dark Silence

    Тогда действительно не обойтись без BeginPath и прочих функций. Сначала придется создать сложный регион просто включающий все строки в себя (нарисовав путь DrawText'ом). После чего вычислить его границы - тут уж тебе только фантазия поможет выбрать оптимальный способ.
     
  11. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia
    alpet



    Я использовал этот способ, но у него один существенный недостаток. Он очень тормозной! (((
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Dark Silence

    Что у тебя более всего тормозит? Преобразование региона в прямоугольник? Может лучше вообще не мучаться - скачать исходники Mozilla, и посмотреть как там данная задача решена.
     
  13. Dark Silence

    Dark Silence New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    16
    Адрес:
    Russia
    alpet

    После:

    BeginPath

    DrawText

    EndPath



    получаем регион (строго говоря не всегда :))) ) состоящий из буковок, далее мне из всего этого буйства необходимо получить регион обрамляющий текст. Этот алгоритм я себе плохо представляю, да и вся эта затея ообще не интересна, т.к. вся эта ерунда работает только с TT шрифтами... гиблое дело короче.



    Исходники мурзиллы ... ну вообще у меня вот исходники двухтонника валяются ... я к ним присматриваюсь ... но у меня коммерческий проект, поэтому - что тырить у Мелкомягких, что у ГПЛной мурзиллы, всё едино "противозаконно" .... даже не могу решиться ))))))))))))
     
  14. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Dark Silence



    Сдается мне что авторы большинства html-движков взяли какой-нибудь уже известный алгоритм для этих целей.



    Если уж очень хочется изобрести собственно свое и для коммерческих целей, может не нада здесь устраивать паблик обсуждение этого алгоритма? Я склоняюсь к тому что придется городить нечто вроде оптимизированного алгоритма DrawText, который будет во время отрисовки будет также и создавать регион, включающий прямоугольники строк.