Координата передаваемая в TextOut относительно бокса символа

Тема в разделе "WASM.WIN32", создана пользователем The Svin, 18 мар 2006.

  1. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Координата передаваемая в TextOut относительно бокса символа



    Никак не могу получить точной информации о сабже.

    Допустим метрика в контексте по умолчанию пиксельная.

    Что за пиксель описывают аргументы TextOut (пусть TextOut принимает координаты первого символа).

    Т.е. включённый\исключённый он из бокса символа.

    Позиционируется относительно hight или ExternalLeading или ещё как то.
     
  2. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    SetTextAlign
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    The Svin

    Приношу извинения, не ту тему удалил — вторая обычно дубляж при плохом коннекте, не глянул.
     
  4. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    AsmGuru62

    Не понял. Я спрашиваю про, то какое место эта координата внутри пикселей (или относительно пикселей) принадлежащих букве занимает.

    Я уже кажется после мучений определил. Это левый верхний пиксель принадлежащий символьному боксу, если область опеределения отсчитывать по верхнему из входящих строк в Height (т.е. отбрасывая ExternalLeading).



    Там пять величин в частях символьного бокса на которые можно ориентироваться (строить координаты) дробя поле пиксельных квадратиков, в которых рисуется символ. В описании TextOut ни слова не сказано какой конкретно из пикселей символьного бокса учавствует в определении координаты для TextOut.

    Ещё раз убедился что документация MS полное г%вно.

    Вот например FillRect принимает как аргумент RECT. Так мля ни слова про то какие координаты определяют входящие, а какие граничные пиксели. Поскольку координат 4е, то получаем 16 вариантов по граничности\принадлежности(2^4). Ничего серьёзно написать пока не узнаешь наверняка - невозможно. Эксперементально определил что первые две - входящие пиксели, а следующие граничные. Причём чувствую себя при этом дискомфортно, так как если в доке они ни слова не пишут, то вполне возможно предположение, что то,что я определил - точно только для GDI текущей версии.

    Они это специально так пишут или им вообще математика с логикой неизвестна и они "на глазок" рисуют?!
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    The Svin

    > "Вот например FillRect принимает как аргумент RECT. Так мля ни слова про то какие координаты ..."

    MSDN, RECT:

    "When RECT is passed to the FillRect function, the rectangle is filled up to, but not including, the right column and bottom row of pixels"



    "..точно только для GDI текущей версии"

    ИМХО открытое тобой правило действует с незапамятных досовских времен и менять его никто не собирается ;) А сделано это из соображений удобства расчетов right=left+width и т.п. (хотя может есть и другие соображения :)
     
  6. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Да проглядел...

    А что там про координату в TextOut. Иде она относительно символьного бокса?
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Я понимаю, что координата задана через SetTextAlign.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    The Svin

    В подтверждение скромных намеков AsmGuru62 на Get\SetTextAlign, обратимся к первоисточникам ;)

    MSDN сейчас под рукой нет, поэтому приведу цитату из Win32.hlp:

    Раздел Fonts and Text\Text-Formatting Attributes:

    Applications can use the SetTextAlign function to specify how Windows should position the characters in a string of text when they call one of the drawing functions.

    Windows positions a string of text by aligning a reference point on an imaginary rectangle that surrounds the string, with the current cursor position or with a point passed as an argument to one of the text drawing functions


    Далее приводится 3х3=9 возможных комбинаций вертикального и горизонтального выравнивания и рисуночек, иллюстрирующий работу TextOut (у меня к сожалению "не удается отобразить рисунок" :) И наконец:

    The default text alignment for a device context is the upper left corner of the imaginary rectangle that surrounds the text
     
  9. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Дык недостаточно было бы мне это upper left corner.

    Но за разъяснения спасибо к чему тут SetTextAlign leo и AsmGuru62

    Я понял по крайней мере что во всех версиях она одинакова.

    Понимаете ли "воображаемый прямоугольник который окружает текст" - вот это как раз и есть то качество разъяснений, которое меня раздражает в MS. GDI не может оперировать точками в геометрическом смысле, точка - это то, что не имеет площади, как и линия - это то что не имеет ширины.

    На самом деле мы рисуем, раскрашивая квадратики. И если перевести все с этой точки зрения, то мыслить можно, например, в адресах столбцов и строк этих квадратиков. Когда же мне говорят в геометрическом смысле "точка находится в углу" я в эту систему квадратиков перевести однозначно это не могу, так как в этом случае точка находящаяся "в углу" может быть в равной степени отнесена к любому из четырёх квадратиков в её окрестности.

    А самое разъяснения "воображаемый прямоугольник окружающий текст" - это вообще не разъяснение даже для тех кто только начальную школу закончил, это - образ, который для детсадовского малыша, чтоб он "ухватил" направление идеи.

    И в конце концов это просто математически неверно даже как приближённая идея.

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

    Т.е. обводил бы этот прямоугольник не сами символы а области отданные для его рисования. И "координата" описывала бы не "точку" а условно скажем "адрес" (в смысле адресации в Exel например) квадратика ориентированного в какой то части этой области. Сама эта область хорошо описана (опять же не MS а понимающими в описаниях людьми типа Петзольда и др.) и у меня было подозрение, что не вся она учавствует здесь при задании координаты (что учавствует именно она а не какой-то там непонятный "текст" вокруг которого воображаемые прямоугольники рисуются - я не сомневался). Область эта в данном случае будет InternalLeading. Т.е. координата описывает младший по столбцу и строке пиксел включённый в область рисования символа в части InternalLeading.
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Совет: если надо вычислить размеры текста на поверхности Device Context - не надо использовать никакие параметры возвращаемые через TEXTMETRICS структуру или каким либо другим способом. Комбинация всех этих Leadings и других параметров не всегда приводит к правильному результату. Лучше всего - спросить сам Device Context через GetTextExtentPoint32. Конечно, сначала надо создать этот Device Context и выбрать в него шрифт через SelectObject, но зато нет проблематичных расчётов.



    Теперь, по поводу прямоугольника и пикселей - прямоугольник этот полностью покрывает текст. Самый левый верхний пиксель прямоугольника совпадает с левым верхним прямоугольником символа (это если параметры выравнивания не были изменены через SetTextAlign). Если изменить параметры выравнивания - точка начала рисования изменится, но останется ВНУТРИ прямоугольника символа.
     
  11. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Не надо. Я уже сказал, что надо - определение координаты для TextOut относительно символа.





    Это может быть верно а может быть нет в зависимости от того как ты определишь что такое "прямоугольник символа".

    Если ты определяешь под термином "прямоугольник символа" верхнюю часть по планке InternalLeading - то это верно.

    Если по классическому определению, либо любому другому - то нет.
     
  12. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    The Svin

    1) The rectangle that bounds the text is formed by the character cells in the text string

    2) The character cell is an imaginary rectangle that surrounds each character or symbol in a Windows font. Т.е. бокс ячейки хоть и "воображаемый", но не как в голову взбредет, а это есть характеристика заданного шрифта Windows font.

    3) Соответственно высота бокса для всех символов заданного шрифта фиксирована и равна TEXTMETRIC.tmHeight, возвращаемой GetTextMetrics

    4) tmHeight=tmAscent+tmDescent, причем The maximum ascent and descent are different from the typographic ascent and descent, т.к. tmAscent включает в себя tmInternalLeading и это наглядно показано на рисунке в Win32.hlp в разделе Fonts and Text\String Widths and Heights

    5) Разобравшись с боксом ячейки возвращаемся к RECT и делаем вывод, что по умолчанию left-top corner это левый верхний пиксел внутри бокса первого символа строки в области InternalLeading.
     
  14. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Я немного потерялся. То ли от том мы говорим, то ли о сём.

    Если о том, в каком месте пиксел в структуре\клеточках шрифта - так я понял давно, и уж написал, что понял.

    Если о том как документация MS об этом пишет, так все приведённые аргументы только больше меня убедили что криво. Утомило меня уже постоянное упоминание о картинке в Win32.hlp, видел я эти картинки и уже сказал (повторяюсь!)

    что структуру шрифта точнее описали Петзольд, Фролов и другие. То что ты написал - это догадки и логические заключения из разных обрывков из документации. Точно MS определения не даёт. А догадатся можно, грудные дети вон тоже только мычат, а мамки их как-то догадываются то ли какать хочет толи титьку пососать. Если бы документация была нормальной то была бы точно дана ссылка типа character box. И там была бы однозначная картинка какие мол части в charater box входят.

    У меня ощущение шизы полной. Ну и что что высота фиксирована? Откуда понятно то (где чётко написано) что по вертикали charater box включает именно куски структуры шрифта объединённые в hieght, Откуда в тексте документации то это чётко прописано? Hieght вещь условная она с hight реального символа может не совпадает, а если она не всегда совпадает то кто запретит так же предположить что кусок называемый ExternalLeading не может быть включён? Не надо мне больше писать "внутри бокса первого символа", у меня уже в глазах темнеет. Он не "внутри бокса" - он принадлежит боксу. Который сам по себе составлен из пикселей. Это не линия, нет линий в геометрическом понятии в машинной графике.
     
  15. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    А чем вызван твой интерес к этой теме?

    Какую именно проблему надо решить?

    Или это чисто теоретический вопрос?
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    The Svin

    Дык никто и не утверждает, что в документации MS все описано четко и ясно. Действительно кое-что приходится домысливать, причем чем больше знаешь, тем больше вопросов может возникнуть. Я вот ламер, с Петзольдом, Фроловым и другими не знаком, дык у меня и не возникает вопросов и подозрений что за tmHeight может скрываться нечто иное нежели высота бокса ячейки, просто "умишки не хватает" ;)

    Ладно пожалуй хватит разводить бодягу, сойдемся в общем мнении: MS - отстой :))
     
  17. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia


    Таблички я разные по работе делаю.

    Там нужно её правильно распологать и тексты внути ячеек позиционировать.

    Различные графические отображения сигнала с выделениями разными структур, где тоже рисовать нужно точно тест и разрираться програмно можно ли вообще это или как модифицировать.

    Т.е. я не могу сказать что это одна какая-то задача.



    Да, и спаcибо за участие. Моё раздражение в постах оно целиком к MS относится и конечно же не к вам :)