bash.im ithappens.me zadolba.li
5502

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

20 февраля 2011, 09:00

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

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