"Bash.org.ru IT Happens Истории ## 5501 – 5600" - читать интересную книгу автора (Bash.org.ru IT)

#5502: Споткнулся, упал, очнулся — буква

12:00 20.02.2011, IT happens


Кто хоть раз мучился на C# с выводом форматированного текста в майкрософтовском GDI+, знает, что для точных измерений размеров выводимого текста нужно пользоваться методом MeasureCharacterRanges, так как MeasureString даёт лишь приблизительный размер прямоугольника, в который гарантированно укладывается выводимый на экран текст. Эти пляски необходимы, если ты уже нарисовал какой-то текст на экране, а теперь надо продолжить с того же места. Предлагаемая методика, хоть и громоздка, но считает всё точно, и привыкнуть к ней можно.


Разбирая код одного сумрачного гения с сертификатом MCSE, я узрел совершенно чудный алгоритм решения той же задачи. Определяются размеры буквы W, домножаются на количество букв в выведенном тексте, а потом из полученной точки правее выведенного текста начинется перебор всех пикселей справа налево, пока не встретится пиксель, отличный по цвету от фона. Затем определяется ширина пробела, прибавляется к найденной точке — и отсюда надлежит выводить следующий блок текста. Надо ли говорить, что измеренные таким образом размеры никаких гарантий не давали, если строка с выведенным текстом оканчивалась на буквы вроде T или V, а скорость вывода текста после исправления возросла в три раза?